【发布时间】:2021-04-21 06:07:50
【问题描述】:
我在 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>
MainWindow.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,那么我可以看到动态菜单项。
谁能告诉我我在做什么错?
【问题讨论】:
-
你在
Window中有DynamicMenuItems吗? -
否,在 MainViewModel 中(不同的类文件)。我将这个viewmodel类的对象分配给Window的DataContext。正如我所提到的,如果我像这样绑定 DynamicMenuItems
那么我可以看到动态菜单项。 -
那你怎么合并
ResourceDictionary呢? -
在 App.xaml 中。
<ResourceDictionary Source="Styles/MenuItems.xaml" />
标签: wpf resourcedictionary collectionviewsource