2017-03-07 6 views
1

Warum dies funktioniert:WPF => Binding ContextMenu mit Collection

<Button x:Name="btnCritereAdd" Content="{Binding Source={x:Static resx:resMain.lblCriterAdd}}" Style="{StaticResource btnStandardClr}" Click="btnMenuPopup_Click" ContextMenuService.Placement="Bottom"> 
    <Button.ContextMenu> 
     <ContextMenu x:Name="cmuCriteres"> 
      <ContextMenu.ItemsSource> 
       <Binding Path="CriteresDispo" /> 
      </ContextMenu.ItemsSource> 
      <ContextMenu.InputBindings> 
       <MouseBinding MouseAction="LeftClick" Command="" /> 
      </ContextMenu.InputBindings> 
     </ContextMenu> 
    </Button.ContextMenu> 
</Button> 

Aber nicht dies:

<Button x:Name="btnCritereAdd" Content="{Binding Source={x:Static resx:resMain.lblCriterAdd}}" Style="{StaticResource btnStandardClr}" Click="btnMenuPopup_Click" ContextMenuService.Placement="Bottom"> 
    <Button.ContextMenu> 
     <ContextMenu x:Name="cmuCriteres"> 
      <ContextMenu.Resources> 
       <CollectionViewSource x:Key="cvsCriteres" Source="{Binding CriteresDispo}"/> 
      </ContextMenu.Resources> 
      <ContextMenu.ItemsSource> 
       <Binding Source="{StaticResource cvsCriteres}" /> 
      </ContextMenu.ItemsSource> 
      <ContextMenu.InputBindings> 
       <MouseBinding MouseAction="LeftClick" Command="" /> 
      </ContextMenu.InputBindings> 
     </ContextMenu> 
    </Button.ContextMenu> 
</Button> 

stelle ich die Datacontext auf Knopf in Codebehind:

btnCritereAdd.DataContext = vmFiltresChamps; 

I versucht mit "UpdateSourceTrigger = PropertyChanged" und "NotifyOnSourceUpdated = True" für beide Fälle, aber nichts ändert sich. Die Liste ist leer ...

Haben Sie eine Idee?

VM-Seite: Eigentum:

public ItemCollection CriteresDispo { get { return _CriteresDispo; } set { _CriteresDispo = value; RaisePropertyChanged(nameof(CriteresDispo)); } } 

Befehl von Code aufgerufen hinter

public RelayCommand<ItemCollection> LoadCriteresCommand { get; set; } 

private void LoadCriteres(ItemCollection obj) { 
     var ht = new tblFiltreChamps(); 
     Classes.clsUtils.GetFiltresSel(obj, ht); 
     CriteresDispo = new ItemsControl().Items; 
     if (ht.items.Count > 0) { 
      foreach (var item in ht.items.OrderBy((x) => x.Desc).ToList()) { 
       var mi = new MenuItem() { Header = item.Desc, Tag = item }; 
       mi.Command = AddCritereCommand; 
       mi.CommandParameter = item; 
       CriteresDispo.Add(mi); 
      } 
     } 
     if (CriteresAddAction != null) CriteresAddAction(); 
} 
+0

Versuchen Sie, die CollectionViewSource zu den Schaltflächen Ressource, Ressource nach oben gehen den visuellen Baum hinauf und horizontale Lookup kann eigentümlich gehen, Fehler, überprüfen Sie Ihr Ausgabefenster für Binding-Fehler – MikeT

+0

Hallo MikeT, habe ich bereits versucht, es in button.resource aber nichts ändert sich. Was ist die horizontale Suche? – david

+0

eine horizontale Suche sucht nach Ressourcen in der gleichen Ebene der visuellen Struktur definiert – MikeT

Antwort

0

CollectionViewSource nicht implementiert IEnumerable und kann daher nicht auf die ItemsSource Eigenschaft eines ContextMenu eingestellt werden, was vom Typ IEnumerable.

Daher müssen Sie ändern:

<ContextMenu.ItemsSource> 
    <Binding Source="{StaticResource cvsCriteres}"/> 
</ContextMenu.ItemsSource> 

An:

<ContextMenu.ItemsSource> 
    <Binding Source="{StaticResource cvsCriteres}" Path="View"/> 
</ContextMenu.ItemsSource> 

Dies wird die ItemsSource auf die CollectionViewSource ‚s View Eigenschaft festgelegt, die vom Typ ist CollectionView und istIEnumerable implementieren

0

Do you have an idea ?

Bei Bindung an StaticResource wird die Zieleigenschaft nicht aktualisiert, wenn Sie das Ereignis PropertyChanged für die Eigenschaft auslösen, die an die Source-Eigenschaft von CollectonViewSource gebunden ist.

Das ist der Unterschied.

Sie müssen für die ItemsSource Sammlung für diese spezielle Eigenschaft auf eine Eigenschaft und erhöhen die PropertyChanged Ereignis binden aufgefrischt zu erhalten.