ResourceDictionary 中的 WPF CollectionViewSource

问题描述

我在 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 位于 时,动态菜单项加载正常。但它不适用于 ResourceDictionary.xaml

enter image description here

这是我得到的 XAML 绑定错误

enter image description here

如果我将 ObservableCollection DynamicmenuItems 直接绑定到 MenuItem,那么我可以看到动态菜单项。

谁能告诉我我做错了什么?

解决方法

CollectionViewSource 未添加到可视化树中,因此它没有可以使用 {RelativeSource} 绑定到的可视化祖先。

但是您应该能够直接绑定到当前的 DataContext,就像您在原始 XAML 标记中所做的那样:

<CollectionViewSource Source="{Binding DynamicMenuItems}" x:Key="DynamicMenuItems"/>

只需将工作标记移至资源字典并按原样使用即可。