Привет всем. Хотел бы узнать 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, которую я показал выше, это не работает. Команда вообще не срабатывает. Подскажите в чем может быть проблема? И как реализовать следующие моменты, которые я описал
CommandParameter="{Binding}"– Андрей NOP Nov 27 '17 at 17:16OnCalculatorPriceProductRequestне можете просто использоватьthis? Зачем вам этот параметр вообще? – VladD Nov 27 '17 at 17:16ProductViewModel. – VladD Nov 27 '17 at 17:23<Button Command="{Binding DataContext.RequestCalculatorPriceProduct, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" CommandParameter="{Binding}"/>– Андрей NOP Nov 27 '17 at 17:31BasePage<VM> : Page where VM : BasePageViewModel. В этом базовом классе для страниц, объявлено свойство, при установке которого задается контекст в сеттере: `set { if( viewModel == value ) return;}`
– Bretbas Nov 27 '17 at 17:51CommandParameter="{Binding}"он понимает, какой конткретноProductViewModelпередавать? – Bretbas Nov 27 '17 at 18:04