Как в WPF привязаться к команде во ViewModel из Model DataContext?
Используя шаблон MVVM создаю несколько экземпляров модели данных и упаковываю их в List для хранения в ViewModel. Затем по клику на UserControl привязанном к модели, с помощью RelayCommand, в коллекции будет меняться состояние свойства модели (для простоты цвет фона), а задача UserControl отобразить изменения во View.
BorderControl.xaml
<UserControl x:Class="TestWpfApp.BorderControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:TestWpfApp"
mc:Ignorable="d">
<UserControl.Resources>
<Style TargetType="{x:Type Border}">
<Setter Property="Width" Value="{Binding Path=Width, RelativeSource={RelativeSource TemplatedParent}}"/>
<Setter Property="Height" Value="{Binding Path=Height, RelativeSource={RelativeSource TemplatedParent}}"/>
<Setter Property="Background" Value="{Binding Path=Background, RelativeSource={RelativeSource TemplatedParent}}"/>
</Style>
<Style TargetType="{x:Type local:BorderControl}">
<Setter Property="Width" Value="100"/>
<Setter Property="Height" Value="100"/>
<Setter Property="Margin" Value="10"/>
<Setter Property="Background" Value="{Binding Path=Background, UpdateSourceTrigger=PropertyChanged}"/>
</Style>
</UserControl.Resources>
<UserControl.Template>
<ControlTemplate>
<Border/>
</ControlTemplate>
</UserControl.Template>
</UserControl>
BorderModel.cs
class BorderModel
{
public SolidColorBrush Background { get; set; } = new SolidColorBrush(Colors.Wheat);
}
ViewModel.cs
class ViewModel
{
private RelayCommand controlClickedCommand;
public List<BorderModel> Models { get; set; } = new List<BorderModel>()
{
{new BorderModel() }, {new BorderModel()}, {new BorderModel()}
};
public RelayCommand ControlClickedCommand => controlClickedCommand ?? new RelayCommand(ControlClicked);
private void ControlClicked(object args)
{
Models[0].Background = new SolidColorBrush(Colors.Red);
}
}
MainWindow.xaml
<Window x:Class="TestWpfApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:TestWpfApp"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Window.DataContext>
<local:ViewModel/>
</Window.DataContext>
<Grid>
<ItemsControl ItemsSource="{Binding Models}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<local:BorderControl/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
</Window>
Для того, чтобы привязаться и выполнить команду ControlClickedCommand в ViewModel я могу использовать InputBindings в BorderControl:
<ControlTemplate>
<Border>
<Border.InputBindings>
<MouseBinding Command="{Binding ControlClickedCommand}" MouseAction="LeftClick"/>
</Border.InputBindings>
</Border>
</ControlTemplate>
Но из-за то, что DataContext у Border это BorderModel упакованная в List, не понятно, как привязаться к RelayCommand ControlClickedCommand ViewModel при клике по BorderControl.
