Domanda

Ho notato questo un paio di volte quando si usano i menu con i comandi, non sono molto dinamici, check this out. Io sono la creazione di un menu da una collezione di colori, lo uso per colorare una colonna in un DataGrid. Comunque quando ho il menu (è un menù contestuale) il parametro di comando legame accade e si lega alla colonna che il menu di contesto è stato aperto. Tuttavia, la prossima volta che portarlo sembra WPF memorizza nella cache il menu e si pretende molto rilegare la parametro di comando. così posso impostare il colore solo sulla colonna iniziale che il menu contestuale è apparso su.

ho ottenuto intorno a questa situazione in passato, rendendo il menu completamente dinamica e distruggendo la collezione quando il menu chiuso e forzando una ricostruzione la prossima volta quando ha aperto, non mi piace questo hack. Chiunque ha un modo migliore?

    <MenuItem
       Header="Colour"
       ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:ResultEditorGrid}}, Path=ColumnColourCollection}"
       ItemTemplate="{StaticResource colourHeader}" >
       <MenuItem.Icon>
          <Image
             Source="{StaticResource ColumnShowIcon16}" />
       </MenuItem.Icon>
       <MenuItem.ItemContainerStyle>
          <Style
             TargetType="MenuItem"
             BasedOn="{StaticResource systemMenuItemStyle}">
             <!--Warning dont change the order of the following two setters
                                otherwise the command parameter gets set after the command fires,
                                not mush use eh?-->
             <Setter
                Property="CommandParameter">
                <Setter.Value>
                   <MultiBinding>
                      <MultiBinding.Converter>
                         <local:ColumnAndColourMultiConverter/>
                      </MultiBinding.Converter>
                      <Binding RelativeSource="{RelativeSource AncestorType={x:Type DataGridColumnHeader}}" Path="Column"/>
                      <Binding Path="."/>
                   </MultiBinding>
                </Setter.Value>
             </Setter>
             <Setter
                Property="Command"
                Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:ResultEditorGrid}}, Path=ColourColumnCommand}" />
          </Style>
       </MenuItem.ItemContainerStyle>
    </MenuItem>
È stato utile?

Soluzione

Il problema è che ContextMenu di a quanto pare la radice della propria struttura ad albero visuale ho letto da qualche parte che prende il DataContext sua genitore, ma solo una volta sul caricamento, quindi se i genitori DataContext cambia il menuitems non lo fa. (Purtroppo non riesco a trovare un link per questo diritto non)

Ho incontrato questo problema prima, e quello che ho fatto è stato l'uso di Josh Smith virtuale Branch modello . E 'abbastanza tecnico, ma l'articolo mi ha aiutato a capire molto bene cosa stava succedendo con questo albero sciocchezze visiva.

In sostanza si crea questo ponte che si lega al DataContext della vista. Viene creato il ponte di come una risorsa statica , che consente di associare ad esso dal menu di scelta rapida, anche se è al di fuori della struttura ad albero visuale.

Aggiungi questo al vostro XAML:

<Window.Resources>
   <!-- This is the "root node" in the virtual branch
   attached to the logical tree. It has its
   DataContext set by the Binding applied to the
   Window's DataContext property. -->
   <FrameworkElement x:Key="DataContextBridge" />
</Window.Resources>

<Window.DataContext>
   <!-- This Binding sets the DataContext on the "root node"
   of the virtual logical tree branch.  This Binding
   must be applied to the DataContext of the element
   which is actually assigned the data context value. -->
   <Binding
    Mode="OneWayToSource"
    Path="DataContext"
    Source="{StaticResource DataContextBridge}"
   />
</Window.DataContext>

Questo è il ponte di cui parlavo. Prende il DataContext e it_ __pushes per ai ponti DataContext, che è (come detto in precedenza) una risorsa statica.

Quindi è sufficiente questo per DataContext del menu contestuale:

 DataContext="{Binding
               Source={StaticResource DataContextBridge},
               Path=DataContext}"

Ora buttare via tutte le relative pathing ecc e l'uso regolare di legame all'interno delle voci di menu, e si dovrebbe andare bene. Il DataContext aggiornerà come al solito.

Solo una nota:

Sarà, ovviamente, avere qualche proprietà nel DataContext di discernere quale comando per l'uso, ma sono sicuro che si può capire. Questa soluzione si occupa solo con l'aggiornamento Non il modo del menu contestuale

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top