使用MVVM获取在MPF中选中的复选框

时间:2018-07-20 20:46:39

标签: c# wpf checkbox mvvm

我目前正在尝试在一长列复选框项上实现ctrl和shift选择功能。现在,您可以通过单击列表中的名称来突出显示/选择项目,还可以使用ctrl或shift选择组。但是,这不会影响复选框。我想通过选中/取消选中所有选中的项目来允许组复选框切换,如果选中的内容已经选中/取消选中。

这意味着尝试检索已选中/未选中的项目并比较其IsSelected属性。

This post是我所寻找的最接近的东西。

这是我现在拥有的xaml:

<ListView Name="LeftListView"
          Grid.Row="4" Grid.Column="1"
          ItemsSource="{Binding CvsLeftListView}">

    <ListView.ItemContainerStyle>
        <Style TargetType="{x:Type ListViewItem}">
            <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
        </Style>
    </ListView.ItemContainerStyle>

    <ListView.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel Orientation="Vertical"/>
        </ItemsPanelTemplate>
    </ListView.ItemsPanel>

    <ListView.ItemTemplate>
        <DataTemplate>
            <VirtualizingStackPanel Orientation="Horizontal">
                <CheckBox Name="LeftListCheckBox"
                          IsChecked="{Binding Path=IsChecked, Mode=TwoWay}"
                          Command="{Binding Path=DataContext.CheckBoxChanged, RelativeSource={RelativeSource AncestorType=ListView}}"
                          Checked="LeftListCheckBox_Checked" Unchecked="LeftListCheckBox_Unchecked"/>
                <TextBlock Name="LeftListName"
                           Text="{Binding Name}"
                           Margin="2,0,0,0"/>
            </VirtualizingStackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

以及部分对象类供参考:

public class MyObject : ObservableObject
{
    // Fields
    private string _id;
    private string _fullName;
    private string _name;

    private bool _isChecked;
    private bool _isVisible;
    private bool _isSelected;

    #region Constructors

    #region Properties
}

2 个答案:

答案 0 :(得分:1)

我最终将事件侦听器附加到列表中的每个对象。每当调用它时,它都会检查是否a)复选框已更改,b)选中/突出显示了该项目,以及c)可见了该项目。如果满足所有这些要求,则它将更改所有其他选定/突出显示的项目的复选框。

这是ViewModel中的代码。我在构造函数中将此侦听器添加到了对象的PropertyChanged事件中。

private void MyObject_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    MyObject modifiedItem = sender as MyObject;

    if (e.PropertyName == "IsChecked" && modifiedItem.IsVisible && modifiedItem.IsSelected)
    {
        if (this.LeftListViewDisplayList.Contains(modifiedItem))
        {
            this.PropagateCheck(this._cvsLeftListView, this.LeftListViewDisplayList, modifiedItem.IsChecked);
        }
    }
}

private void PropagateCheck(ICollectionView displayedCollection, ObservableCollection<MyObject> storedCollection, bool checkValue)
{
    List<int> _groupIndices = new List<int>(displayedCollection.Cast<MyObject>().Count());

    foreach (MyObject item in displayedCollection)
    {
        if (item.IsSelected)
        {
            _groupIndices.Add(storedCollection.IndexOf(item));
            item.IsSelected = false;
            item.IsChecked = checkValue;
        }
    }

    foreach (int i in _groupIndices)
    {
        storedCollection[i].IsSelected = true;
    }

    displayedCollection.Refresh();
}

答案 1 :(得分:0)

如果我对您的理解很好-您想将CheckBoxes绑定到ListBoxItem选择。所以可能您只需要下面的代码-将CheckBox.IsChecked属性绑定更改为IsSelected一个?

<CheckBox Name="LeftListCheckBox"
                      IsChecked="{Binding Path=IsSelected, Mode=TwoWay}"... />