问题描述
我在 ResourceDictionary 文件中有 CollectionViewSource。
MenuItems.xaml
<!--This code is not working-->
<CollectionViewSource Source="{Binding DynamicmenuItems,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window}}" x:Key="DynamicmenuItems"/>
<Style x:Key="DynamicmenuItemStyle" targettype="{x:Type MenuItem}">
<Setter Property="Header" Value="{Binding Path=Header}" />
</Style>
<Style x:Key="Dynamicmenu" targettype="{x:Type MenuItem}" >
<Setter Property="Header" Value="Dynamic Menu" />
<!--<Setter Property="ItemsSource" Value="{Binding Source={StaticResource DynamicmenuItems}}" />-->
<Setter Property="ItemContainerStyle" Value="{StaticResource DynamicmenuItemStyle}" />
<Setter Property="ItemsSource">
<Setter.Value>
<Compositecollection>
<CollectionContainer Collection="{Binding Source={StaticResource DynamicmenuItems}}" />
<Separator />
<MenuItem Header="Static Menu Item" />
</Compositecollection>
</Setter.Value>
</Setter>
</Style>
主窗口.xaml
<Window.Resources>
<!--This code is working-->
<CollectionViewSource Source="{Binding DynamicmenuItems}" x:Key="WindowResourceDynamicmenuItems"/>
<Style x:Key="WindowResourceDynamicmenu" targettype="{x:Type MenuItem}" >
<Setter Property="Header" Value="Dynamic Menu" />
<Setter Property="ItemContainerStyle" Value="{StaticResource DynamicmenuItemStyle}" />
<Setter Property="ItemsSource">
<Setter.Value>
<Compositecollection>
<CollectionContainer Collection="{Binding Source={StaticResource WindowResourceDynamicmenuItems}}" />
<Separator />
<MenuItem Header="Static Menu Item" />
</Compositecollection>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid Background="WhiteSmoke">
<Grid.ContextMenu>
<ContextMenu>
<MenuItem Header="Dynamic Menu Items" Style="{StaticResource WindowResourceDynamicmenu}"/>
<MenuItem Header="Resource Dictionary Dynamic Menu Items" Style="{StaticResource Dynamicmenu}"/>
<MenuItem Header="Static Menu Item" />
</ContextMenu>
</Grid.ContextMenu>
</Grid>
MenuModel.cs
public class MenuModel
{
public string Header { get; set; }
public MenuModel(string header)
{
Header = header;
}
}
Mainviewmodel.cs
public class Mainviewmodel
{
public ObservableCollection<MenuModel> DynamicmenuItems { get; set; }
public Mainviewmodel()
{
DynamicmenuItems = new ObservableCollection<MenuModel>();
DynamicmenuItems.Add(new MenuModel("Dynamic Menu 1"));
DynamicmenuItems.Add(new MenuModel("Dynamic Menu 2"));
DynamicmenuItems.Add(new MenuModel("Dynamic Menu 3"));
}
}
MainWindow.cs
public partial class MainWindow : Window
{
Mainviewmodel model = null;
public MainWindow()
{
InitializeComponent();
model = new Mainviewmodel();
DataContext = model;
}
}
问题是当 CollectionViewSource 位于
这是我得到的 XAML 绑定错误。
如果我将 ObservableCollection DynamicmenuItems 直接绑定到 MenuItem,那么我可以看到动态菜单项。
谁能告诉我我做错了什么?
解决方法
CollectionViewSource
未添加到可视化树中,因此它没有可以使用 {RelativeSource}
绑定到的可视化祖先。
但是您应该能够直接绑定到当前的 DataContext
,就像您在原始 XAML 标记中所做的那样:
<CollectionViewSource Source="{Binding DynamicMenuItems}" x:Key="DynamicMenuItems"/>
只需将工作标记移至资源字典并按原样使用即可。