#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. Спасибо. Я понимаю, что ты имеешь в виду. Подключение к неправильному месту вызвало проблему.