В моем приложении у меня есть представление (ListView) и модель представления. В модели внутреннего вида у меня есть 2 свойства: первое - это список элементов, а второе - команда. Я хочу отображать элементы (из первого свойства) внутри ListView. Кроме того, я хочу, чтобы для каждого из них было контекстное меню, в котором нажатие на него активирует команду (из второго свойства).
Вот код моей модели взгляда:
public class ViewModel
{
public IEnumerable Items
{
get
{
return ...; //returns a collection of items
}
}
public ICommand MyCommand //this is a command, I want to be able execute from context menu of each item
{
get
{
return new DelegateCommand(new Action<object>(delegate(object parameter)
{
//here code of the execution
}
), new Predicate<object>(delegate(object parameter)
{
//here code of "can execute"
}));
}
}
Теперь часть XAML:
<ListView ItemsSource="{Binding Items}">
<ListView.Resources>
<commanding:CommandReference x:Key="myCommand" Command="{Binding MyCommand}"/>
</ListView.Resources>
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock
Text="{Binding Name}"
/>
</DataTemplate>
</ListView.ItemTemplate>
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu>
<MenuItem
Header="Remove from workspace"
Command="{StaticResource myCommand}"
CommandParameter="HERE I WANT TO PASS THE DATA CONTEXT OF THE ListViewItem"
/>
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
</ListView.ItemContainerStyle>
</ListView>
Проблема: пока я фактически не открою контекстное меню, PlacementTarget контекстного меню будет нулевым. Мне нужно как-то получить контекст данных нажатого ListViewItem в «CanExecute» команды, ДО вызываемой команды - и я действительно хочу сделать все в XAML, не обрабатывая никаких обратных вызовов в коде позади.
Спасибо заранее.