【问题标题】:WPF CollectionViewSource in ResourceDictionaryResourceDictionary 中的 WPF CollectionViewSource
【发布时间】: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 位于 中时,动态菜单项加载正常。但它不适用于 ResourceDictionary.xaml

这是我得到的 XAML 绑定错误。

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

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

【问题讨论】:

  • 你在Window中有DynamicMenuItems吗?
  • 否,在 MainViewModel 中(不同的类文件)。我将这个viewmodel类的对象分配给Window的DataContext。正如我所提到的,如果我像这样绑定 DynamicMenuItems 那么我可以看到动态菜单项。
  • 那你怎么合并ResourceDictionary呢?
  • 在 App.xaml 中。 &lt;ResourceDictionary Source="Styles/MenuItems.xaml" /&gt;

标签: wpf resourcedictionary collectionviewsource


【解决方案1】:

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

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

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

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

【讨论】:

  • 不工作,但现在错误不同了。 Cannot find governing FrameworkElement or FrameworkContentElement for target element
猜你喜欢
  • 2014-07-31
  • 1970-01-01
  • 1970-01-01
  • 2012-01-19
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
相关资源
最近更新 更多