ListBox 复选框命令绑定
ListBox checkbox command binding
我想不通。我以为我的绑定设置正确,但它没有触发。所以我有一个观点:
<ListBox x:Name="EquipmentViewsListBox"
ItemsSource="{Binding EquipmentViews, UpdateSourceTrigger=PropertyChanged}"
SelectionMode="Extended"
BorderThickness="0"
Height="150"
Margin="5,5,10,10">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ListBox}, Path=DataContext.ViewSelected}"
CommandParameter="{Binding RelativeSource={RelativeSource Self}}"
Content="{Binding Name}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
我想在每次选中 ListBox
中的复选框时触发命令。我在我的视图模型上创建了一个命令,如下所示:
public class SdddViewModel : ViewModelBase
{
public SdddModel Model { get; set; }
public RelayCommand<ViewWrapper> ViewSelected { get; set; }
public SdddViewModel(SdddModel model)
{
Model = model;
ViewSelected = new RelayCommand<ViewWrapper>(OnViewSelected);
}
private void OnViewSelected(ViewWrapper obj)
{
var asd = obj;
}
}
所以我知道当我执行 ListBox.ItemTemplate
时,该项目的上下文变成 ListBoxItem
所以在我的例子中是 class 对象 ViewWrapper
。这适用于内容的 Name
绑定以及 IsSelected
属性。这是在检查项目时未触发的命令。我将相对祖先设置为 ListBox
和 Path=DataContext
但仍然没有任何反应。想法?
问题是 CommandParameter
不匹配。你声明它所以 CommandParameter
是 ViewWrapper
但你使用 RelativeSource Self
发送了类型 CheckBox
的参数。将 CommandParameter
更改为简单的 {Binding}
这意味着它发送 ListBoxItem
的 DataContext
,即 ViewWrapper
.
您可以使用 Snoop 检测到此绑定错误。
我想不通。我以为我的绑定设置正确,但它没有触发。所以我有一个观点:
<ListBox x:Name="EquipmentViewsListBox"
ItemsSource="{Binding EquipmentViews, UpdateSourceTrigger=PropertyChanged}"
SelectionMode="Extended"
BorderThickness="0"
Height="150"
Margin="5,5,10,10">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ListBox}, Path=DataContext.ViewSelected}"
CommandParameter="{Binding RelativeSource={RelativeSource Self}}"
Content="{Binding Name}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
我想在每次选中 ListBox
中的复选框时触发命令。我在我的视图模型上创建了一个命令,如下所示:
public class SdddViewModel : ViewModelBase
{
public SdddModel Model { get; set; }
public RelayCommand<ViewWrapper> ViewSelected { get; set; }
public SdddViewModel(SdddModel model)
{
Model = model;
ViewSelected = new RelayCommand<ViewWrapper>(OnViewSelected);
}
private void OnViewSelected(ViewWrapper obj)
{
var asd = obj;
}
}
所以我知道当我执行 ListBox.ItemTemplate
时,该项目的上下文变成 ListBoxItem
所以在我的例子中是 class 对象 ViewWrapper
。这适用于内容的 Name
绑定以及 IsSelected
属性。这是在检查项目时未触发的命令。我将相对祖先设置为 ListBox
和 Path=DataContext
但仍然没有任何反应。想法?
问题是 CommandParameter
不匹配。你声明它所以 CommandParameter
是 ViewWrapper
但你使用 RelativeSource Self
发送了类型 CheckBox
的参数。将 CommandParameter
更改为简单的 {Binding}
这意味着它发送 ListBoxItem
的 DataContext
,即 ViewWrapper
.
您可以使用 Snoop 检测到此绑定错误。