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 属性。这是在检查项目时未触发的命令。我将相对祖先设置为 ListBoxPath=DataContext 但仍然没有任何反应。想法?

问题是 CommandParameter 不匹配。你声明它所以 CommandParameterViewWrapper 但你使用 RelativeSource Self 发送了类型 CheckBox 的参数。将 CommandParameter 更改为简单的 {Binding} 这意味着它发送 ListBoxItemDataContext,即 ViewWrapper.

您可以使用 Snoop 检测到此绑定错误。