Как сделать привязку команды к флажку в представлении списка?

#c# #wpf #mvvm #data-binding #command

Вопрос:

Проблема на самом деле такова, как указано в названии. Если CheckBox это снаружи, я могу сделать привязку команды, как показано ниже, и она отлично работает.

Моя CheckBox привязка команд не работает, если я заключу ее в a ListView . Кроме того, когда я создаю a CheckBoxCommand в модели, ошибки привязки нет, но я не мог понять, как использовать CheckBoxCommand ее в своей модели.

 <CheckBox>
    <i:Interaction.Triggers>
       <i:EventTrigger EventName="Click">
            <i:InvokeCommandAction Command="{Binding CheckBoxCommand}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</CheckBox>
 

Модель представления

  public RelayCommand CheckBoxCommand { get; set; }

 public AnalysisViewModel()
 {
     CheckBoxCommand = new RelayCommand(CheckBoxClick);
 }

 private void CheckBoxClick(object param)
 {
     Console.WriteLine("Click");
 }
 

Это не работает в следующем случае. Как я могу запустить его с приложением в следующей ситуации?

 <ListView ItemsSource="{Binding checkMessageList}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <CheckBox Content="{Binding ID}">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Click">
                        <i:InvokeCommandAction Command="{Binding CheckBoxCommand}"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </CheckBox>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListView>
 

Моя модель

 public static readonly ObservableCollection<CanBusDataMessageResponse> checkMessageList = new ObservableCollection<CanBusDataMessageResponse>();

public class CanBusDataMessageResponse
{
    public int IDE { get; set; }
    public int ID { get; set; }
    public byte RTR { get; set; }
    public byte DLC { get; set; }
    public byte Byte0 { get; set; }
    public byte Byte1 { get; set; }
    public byte Byte2 { get; set; }
    public byte Byte3 { get; set; }
    public byte Byte4 { get; set; }
    public byte Byte5 { get; set; }
    public byte Byte6 { get; set; }
    public byte Byte7 { get; set; }
    public DateTime Time { get; set; }
}
 

Ответ №1:

Команда Up, привязывающая мой флажок, не работает, если я помещаю его в представление списка.

Если ваш CheckBox определен в поле ItemTemplate из ListView , его DataContext значение устанавливается для элемента в том checkMessageList , для которого он был создан, а не для контекста данных ListBox .

Ваша исходная привязка ниже предполагает наличие свойства CheckBoxCommand для элементов коллекции, к которым она привязана ItemSource . Если вы добавляете команду в свою модель элемента, эта привязка должна работать.

 <i:InvokeCommandAction Command="{Binding CheckBoxCommand}"/>
 

Для привязки к модели CheckBoxCommand представления, которая является контекстом данных ListView (и также содержит checkMessageList ), вы можете использовать RelativeSource привязку.

 <i:InvokeCommandAction Command="{Binding DataContext.CheckBoxCommand, RelativeSource={RelativeSource AncestorType={x:Type ListView}}}"/>
 

Комментарии:

1. Спасибо. Я понимаю, что ты имеешь в виду. Подключение к неправильному месту вызвало проблему.