我目前正在尝试在一长列复选框项上实现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
}
答案 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}"... />