Передача ссылки на самого себя в параметре команды

198
28 ноября 2017, 19:27

Привет всем. Хотел бы узнать 2 момента по поводу MVVM + WPF. Первый момент легкий, хотел бы узнать, как передать в команду параметр, при срабатывании, на самого себя, через XAML. У меня есть такой код:

<ItemsControl ItemsSource="{Binding CurrentProducts}">
...
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Button Command="{Binding RequestCalculatorPriceProduct}" CommandParameter="{?????}"/>
        </DataTemplate>
    </ItemsControl.Template>
...
</ItemsControl>

Соответственно CurrentProducts - является коллекцией объектов IEnumerable<ProductViewModel>. У каждый ProductViewModel выглядит так:

public class ProductViewModel : BaseViewModel
{
    public Int64    Id { get; set; }
    public string   Name { get; set; }
    public string   Foto { get; set; }
    public ICommand RequestCalculatorPriceProduct { get; }
    public ProductViewModel( Int64 id, string name, string foto )
    {
        Id = id;
        Name = name;
        Foto = foto;
        RequestCalculatorPriceProduct   =   new RelayCommand<ProductViewModel>( OnCalculatorPriceProductRequest );
    }
    private void OnCalculatorPriceProductRequest( ProductViewModel currentProduct )
    {
        ...
    }
}

Мне нужно в обработчике OnCalculatorPriceProductRequest в параметре принимать ссылку на самого себя.

Итак, из вышесказанного уже видно что подход не достаточно верный, поэтому я сразу задаю вопрос на второй момент, который очень тесно связан с предыдущим: Коллекция IEnumerable<ProductViewModel> CurrentProducts у меня лежит во ViewModel страницы. Так вот, мне на самом деле бы хотелось, чтобы команда, которая сейчас в ProductViewModel была именно в ViewModel страницы, и при срабатывании команды, обработчик в параметре имел тот объект ProductViewModel, по которому щелкнули.

Как бы я не старался это сделать, у меня не получается. Вот примерный код ViewModel страницы:

public class MainPageViewModel : BasePageViewModel
{
    ...
    public IEnumerable<ProductViewModel> CurrentProducts
    {
        get { ... }
        set { ... }
    }
    public ICommand RequestCalculatorPriceProduct { get; }
    ...
    public MainPageViewModel()
    {
        RequestCalculatorPriceProduct = new RelayCommand<ProductViewModel>( OnCalculatorPriceProductRequest );
        ...
    }
    private void OnCalculatorPriceProductRequest( ProductViewModel currentProduct )
    {
        // Я хочу вот тут получать выбранный ProductViewModel
    }
    ...     
}

Но с той разметкой XAML, которую я показал выше, это не работает. Команда вообще не срабатывает. Подскажите в чем может быть проблема? И как реализовать следующие моменты, которые я описал

READ ALSO
AXP288 Как получить напряжение батареи. Windows

AXP288 Как получить напряжение батареи. Windows

Имеется планшет c микросхемой управления питанием AXP288, нужно программно получить напряжение с батареи без использования стандартных драйверов...

259
Как точно определять границы контролов WinForms/WPF

Как точно определять границы контролов WinForms/WPF

WinForms добавляю picturebox а в него круглую картинку, но при этом контейнер остаётся прямоугольнымКогда на picturebox вешаю onClick, то появляются пустые...

169