Динамическое меню из ObservableCollection: передача элемента в качестве параметра - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь изменить свойство в моем основном ViewModel на основе щелчка по меню, которое заполняется списком объектов.

ViewModel

public class MyViewModel : ObservableObject
{
    /// <summary>
    /// Private field for products
    /// </summary>
    private ObservableCollection<Product> products;

    /// <summary>
    /// Private field for the product
    /// </summary>
    private Product product;

    /// <summary>
    /// Gets or sets the Product
    /// </summary>
    public Product Product
    {
        get => this.product;
        set
        {
            this.product = value;
            this.RaisePropertyChangedEvent("Product");
        }
    }

    /// <summary>
    /// Gets or sets a collection of Products
    /// </summary>
    public ObservableCollection<Product> Products
    {
        get => this.plant;
        set
        {
            this.plant = value;
            this.RaisePropertyChangedEvent("Products");
        }
    }

    public ICommand ChangeProduct => new DelegateCommand(p => this.SetProduct((Product)p), p => p is Product);

    private void SetProduct (Product product) => this.Product = product;
}

Я пытаюсь изменить Product, нажав MenuItem в Menu.

<Menu Grid.Row="0" Background="White">
    <MenuItem Header="Products">
        <MenuItem Name="ProductMenu" Header="Change Product" ItemsSource="{Binding Products}" DisplayMemberPath="Name" Command="{Binding ChangeProduct}" CommandParameter="{Binding ElementName=ProductMenu}"/>
    </MenuItem>
</Menu>

Это, однако, не работает. Как связать Product, прикрепленный к сгенерированному нажатием MenuItem, в качестве параметра моей ViewModel?

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

Просто измените привязку CommandParameter на CommandParameter="{Binding}", т.е. удалите путь:

<MenuItem Name="ProductMenu"
        Header="Change Product" 
        ItemsSource="{Binding Products}" 
        DisplayMemberPath="Name" 
        Command="{Binding ChangeProduct}" 
        CommandParameter="{Binding}"/>
0 голосов
/ 13 марта 2019

Xaml может быть что-то вроде этого:

<Menu Grid.Row="0" Background="White">
   <MenuItem Header="Products"   >
       <MenuItem Name="ProductMenu" Header="Products"  ItemsSource="{Binding Products}"  DisplayMemberPath="Name" >
                    <MenuItem.ItemContainerStyle>
                        <Style TargetType="MenuItem">
                             <Setter Property="Command" Value="{Binding  ElementName=ProductMenu, Path=DataContext.ChangeProduct}"/>
                            <Setter Property="CommandParameter" Value="{Binding}"/>
                        </Style>
                    </MenuItem.ItemContainerStyle>
                </MenuItem>

   </MenuItem>
</Menu>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...