У меня есть контекстное меню с некоторыми опциями. Один из вариантов - это коллекция Observable, и у меня возникают проблемы с привязкой к ним моих команд в моей модели представления. Я видел много разных способов решить эту проблему, но ни один из них не помог, потому что они не связаны конкретно с моей проблемой. Сначала вот мой код:
XAML:
<ListView ItemsSource="{Binding ListViewItems}" SelectionMode="Single">
<ListView.ContextMenu>
<ContextMenu DataContext="{Binding Path=PlacementTarget, RelativeSource={RelativeSource Self}}">
<MenuItem Header="Test" Command="{Binding TestCommand}" CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=ContextMenu}, Path=PlacementTarget.SelectedItem}" />
<Separator></Separator>
<MenuItem Header="Status" ItemsSource="{Binding DataContext.ObservableCollectionList}" DisplayMemberPath="Name" Command="{Binding Path=DataContext.UpdateCommand}" CommandParameter="{Binding Path=SelectedItem}"/>
</ContextMenu>
</ListView.ContextMenu>
//listviewstuff here
</ListView>
VM :
public class VM : ViewModelBase
{
public RelayCommand UpdateCommand { get; private set; }
public Action UpdateCommandAction { get; set; }
public ObservableCollection<Status> ObservableCollectionList { get; set; }
public VM()
{
this.UpdateCommand = new RelayCommand(new Action(() => this.UpdateCommandAction.DynamicInvoke())));
}
}
Код программной части для представления XAML:
public partial class View
{
public View()
{
InitializeComponent();
var ViewDataContext = this.DataContext as VM;
ViewDataContext .UpdateCommandAction = UpdateStatus;
}
private void UpdateStatus()
{
MessageBox.Show("test");
}
}
Я вставил точку останова, и она даже не дошла до вызова метода. Вывод отладки также не показывает мне ошибку, когда я запускаю программу. Я не понимаю, когда я добавляю эту команду в обычный пункт меню, который НЕ заполняется списком привязанных данных, он работает нормально. Я был бы признателен за свежий взгляд и некоторое понимание того, как это работает.
2 ответа
Вам нужно привязать команду ко всем дочерним элементам, теперь вы привязываете ее к родительскому элементу, который проигнорирует ее, потому что у нее есть дочерние элементы (вместо этого открывается подменю).
Чтобы привязать его к дочерним элементам, вам понадобится ItemContainerStyle
, создайте там Setter
для Command
. Вам нужно будет снова подняться, возможно это: {Binding DataContext.DataContext.UpdateCommand, RelativeSource={RelativeSource AncestorType=MenuItem}}
(не уверен насчет AncestorLevel
, если он выбирает себя, а не родительский, увеличивайте его; удвойте DataContext
, потому что вы привязаны к DataContext.ObservableCollectionList
, предполагая, что привязка действительно работает).
Точно так же в меню нет SelectedItem
, вам нужен другой Setter
для CommandParameter
, он просто привяжется к текущему элементу, то есть {Binding}
.
Изменить: Пример кода:
<MenuItem Header="Status"
ItemsSource="{Binding DataContext.ObservableCollectionList}"
DisplayMemberPath="Name">
<MenuItem.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Command" Value="{Binding DataContext.DataContext.UpdateCommand,
RelativeSource={RelativeSource AncestorType=MenuItem}}"/>
<Setter Property="CommandParameter" Value="{Binding}"/>
</Style>
</MenuItem.ItemContainerStyle>
</MenuItem>
DataContext
меню на PlacementTarget
), тогда команда должна просто взаимодействовать с этим соответствующим элементом.
new RelayCommand(param => UpdateStatus(ID, (Status)param))
, param
должны быть переданными CommandParameter
и ID
— это просто свойство виртуальной машины, содержащее идентификатор пользователя.
Вам понадобится List<MenuItem> MenuItems
для привязки к свойству ContextMenu ItemSource как
public class MenuItem
{
public string Header { get; set; }
public ICommand Command { get; set; }
}
XAML: и установите itemContainerstyle
<ContextMenu ItemsSource="{Binding MenuItems}" >
<ContextMenu.ItemContainerStyle>
<Style TargetType="{x:Type MenuItem}" >
<Setter Property="Header" Value="{Binding Header}"/>
<Setter Property="Command" Value="{Binding Command}" />
</Style>
</ContextMenu.ItemContainerStyle>
</ContextMenu>
И добавьте столько элементов контекстного меню, сколько захотите, в вашу модель просмотра, сколько захотите.
Похожие вопросы
Связанные вопросы
Новые вопросы
wpf
Windows Presentation Foundation, или WPF, является подсистемой для визуализации пользовательских интерфейсов в приложениях на основе Windows.
DataContext
? Если это так, это действительно сбивает с толку, и я бы его избегал)