Я пытаюсь сделать так, чтобы содержимое списка, свойство зависимостей которого отображалось в контекстном меню 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>
Также частью ResourceDictionary выше является CompositeCollection, которая необходима для отображения элементов в реальном контекстном меню. Если свойство UserControl CanStop имеет значение true, мы также показываем разделитель и команду остановки. Эти привязки также не выполняются, хотя сами элементы MenuItem отображаются. Так что, если я смогу выяснить, почему они терпят неудачу, Список может быть проще.
<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>
Я чувствую, что выкладываю много кода, но не уверен, что смогу сделать этот кусок проще. Отображаются только разделитель и пункт меню с жестким кодом. Так что что-то должно быть перепутано с привязками. Связывание обычно не так сложно, но теперь, когда я хочу связать что-то, что не является частью того же дерева, я чувствую себя немного потерянным.
Любые предложения приветствуются. :)