c# - 使用MVVM获取在MPF中选中的复选框项

标签 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
}

最佳答案

我最终将事件监听器附加到列表中的每个对象。每当调用它时,它都会检查是否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();
}

关于c# - 使用MVVM获取在MPF中选中的复选框项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51450160/

相关文章:

javascript - 如何在html复选框值参数中使用javaScript变量?

.net - 为 TextBlock 启用命令绑定(bind)

c# - 如何使 UI 在 Winforms 中响应

jquery - 选择前一个元素 - jQuery

c# - 在 C# 或 C++ 中搜索另一个音频中的音频

c# - 在构建时数据类型未知时将数据对象映射到合适的 ViewModel

jquery - 如何检测复选框中的任何内容是否被选中?

c# - NEST 不允许我添加 func 参数

c# - Blowfish 无效长度异常

c# - ASP .Net 从 SQL Server Compact 数据库获取当前用户 ID