2017-03-07 69 views
1

为什么这是工作:WPF =>绑定文本菜单与CollectionViewSource

<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> 

但不是这样的:

btnCritereAdd.DataContext = vmFiltresChamps; 

我:

<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> 

我在代码隐藏设置的DataContext上的按钮在两种情况下尝试使用“UpdateSourceTrigger = PropertyChanged”和“NotifyOnSourceUpdated = True”,但没有任何更改。 该清单是空的...

你有什么想法吗?

VM方: 物业:

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

命令通过代码调用背后

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

尝试将CollectionViewSource移动到按钮资源,查找资源查找可视化树和水平查找可能会变得奇特,失败的情况是检查输出窗口是否有绑定错误 – MikeT

+0

您好MikeT,我已经尝试tu把它放在button.resource中,但没有任何变化。 什么是水平查找? – david

+0

水平查找正在寻找在相同级别的可视化树中定义的资源 – MikeT

回答

0

CollectionViewSource没有实现IEnumerable,因此不能被设置为ContextMenuItemsSource属性,它是类型IEnumerable

因此,你需要改变:

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

要:

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

这将设置ItemsSourceCollectionViewSourceView属性,这是CollectionView型和实现IEnumerable

0

Do you have an idea ?

当绑定到StaticResource时,当您为与CollectonViewSourceSource属性绑定的属性引发PropertyChanged事件时,目标属性不会得到更新。

这就是区别。

您需要绑定到财产,提高PropertyChanged事件这个特定的属性为ItemsSource收集得到刷新。