У меня есть контекстное меню с некоторыми опциями. Один из вариантов - это коллекция 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");
    }

}

Я вставил точку останова, и она даже не дошла до вызова метода. Вывод отладки также не показывает мне ошибку, когда я запускаю программу. Я не понимаю, когда я добавляю эту команду в обычный пункт меню, который НЕ заполняется списком привязанных данных, он работает нормально. Я был бы признателен за свежий взгляд и некоторое понимание того, как это работает.

0
JTester 22 Июл 2014 в 02:34

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>
1
H.B. 21 Июл 2014 в 23:01

Вам понадобится 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>

И добавьте столько элементов контекстного меню, сколько захотите, в вашу модель просмотра, сколько захотите.

0
Kylo Ren 29 Янв 2016 в 17:17