Как в 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.


Ответы (0 шт):