我正在尝试使依赖属性列表中的内容显示在WPF上下文菜单中。
我有一个类,其中包含以下依赖属性,即Foo(数据持有类)的列表:
public List<Foo> FooList
{
get { return (List<Foo>)GetValue(FooListProperty); }
set { SetValue(FooListProperty, value); }
}
public static DependencyProperty FooListProperty =
DependencyProperty.Register("FooList", typeof(List<Foo>),
typeof(FooButton));
在XAML中,我设置了以下静态资源,我认为这是必需的,因为上下文菜单不是视觉树的一部分:
<UserControl.Resources>
<ResourceDictionary>
<CollectionViewSource
x:Key="FooListSource"
Source="{Binding FooList}"/>
<!-- ... -->
</ResourceDictionary>
</UserControl.Resources>
以上资源字典的一部分是CompositeCollection,需要它才能使项目在实际上下文菜单中显示。如果UserControl CanStop属性为true,则还会显示分隔符和停止命令。这些绑定也会失败,尽管菜单项本身会显示出来。因此,如果我能找出这些失败的原因,列表可能会更容易。
<CompositeCollection x:Key="FooListItems">
<CollectionContainer
Collection="{Binding Source={StaticResource FooListSource}}"/>
<Separator
Visibility="{Binding CanStop,
Converter={StaticResource VisibleIfTrue}}" />
<MenuItem
Command="{x:Static Buttons:FooButton.Stop}"
Header="Stop"
Visibility="{Binding CanStop,
Converter={StaticResource VisibleIfTrue}}"/>
</CompositeCollection>
最后是上下文菜单本身,也在ResourceDictionary中:
<ContextMenu
x:Key="FooButtonMenu"
ItemsSource="{Binding Source={StaticResource FooListItems}}"
ItemTemplate="{StaticResource FooListTemplate}"
<ContextMenu.CommandBindings>
<CommandBinding
Command="{x:Static Buttons:FooButton.Stop}"
Executed="Stop_Executed" />
</ContextMenu.CommandBindings>
</ContextMenu>
我觉得我发了太多的代码,但我不确定我能不能让这一部分更简单。只有分隔符和硬编码的菜单项出现了。所以绑定肯定出了问题。通常绑定并不难,但是现在当我想绑定一些不属于同一树的东西时,我感到有点迷失。
欢迎任何建议。 :)
FooList.Add(myNewFoo);
。您的意思是我应该将List<>
简单地替换为ObservableCollection<>
吗? - Mizipzor