WPF: Menüelemente binden Befehlsparameter nur einmal
Ich habe das ein paar Mal bemerkt, wenn ich Menüs mit Befehlen verwende. Sie sind nicht sehr dynamisch. Schauen Sie sich das an. Ich erstelle ein Menü aus einer Sammlung von Farben und benutze es, um eine Spalte in einem Datagrid einzufärben. Wie auch immer, wenn ich das Menü zum ersten Mal aufrufe (es ist ein Kontextmenü), geschieht die Befehlsparameterbindung und sie bindet an die Spalte, in der das Kontextmenü geöffnet wurde. Jedoch wenn ich es das nächste Mal aufrufe, scheint es, dass wpf das Menü zwischenspeichert und es den Befehlsparameter nicht neu bindet. so kann ich die Farbe nur auf der Anfangsspalte einstellen, auf der das Kontextmenü erschien.
Ich habe diese Situation in der Vergangenheit umgangen, indem ich das Menü total dynamisch gemacht und die Sammlung zerstört habe, als das Menü geschlossen wurde, und beim nächsten Öffnen einen Neuaufbau erzwungen habe. Ich mag diesen Hack nicht. Hat jemand einen besseren Weg?
<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>