带有SelectionMode="Extended"
的简单ListBox绑定到具有IsSelected
属性的视图模型:
<TextBlock Text="{Binding SelectedItems.Count, ElementName=list}" />
<ListBox x:Name="list"
SelectionMode="Extended"
ItemsSource="{Binding listItems}">
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="IsSelected"
Value="{Binding IsSelected}" />
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
当您选择零项目然后执行
listItems.Move(0, 1);
ListBox SelectedItems.Count
从1增加到2.以这种方式增加该计数器后,当您在列表框中选择随机项时,它将减1。
为什么SelectedItems会累积移动的项目并且有没有修复?
的ViewModels:
class MainVM : VMBase
{
public MainVM()
{
listItems = new ObservableCollection<Item>() {
new Item(),
new Item(),
};
}
public ObservableCollection<Item> listItems { get; set; }
}
public class Item : VMBase
{
private bool _isSelected;
public bool IsSelected
{
get { return _isSelected; }
set
{
if (_isSelected != value)
{
_isSelected = value;
OnPropertyChanged("IsSelected");
}
}
}
}
答案 0 :(得分:0)
您描述的行为来自:
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="IsSelected" Value="{Binding IsSelected}" />
</Style>
</ListBox.ItemContainerStyle>
如果删除它,它将起作用,例如,它不会复制这些项目。它似乎是不相容的。
要么继续使用您的解决方案,如果它似乎有用,并且没有任何错误。
您也可以通过订阅&#34; ObservableCollection.CollectionChanged&#34;来解决这个问题。事件和倾听Moved
动作,您可以在其中执行类似于您已经执行的操作。
或者,如果您愿意稍微改变一下:即,您可以放弃&#34; TwoWay&#34;绑定,以使这项工作,所以:
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="IsSelected"
Value="{Binding Path=IsSelected, Mode=OneWayToSource}" />
</Style>
</ListBox.ItemContainerStyle>
这仍然会更新您的viewmodel IsSelected
属性,但在vm方面更改它,不会做任何事情。如果您需要该功能,可以考虑通过interface / command将其注入viewmodel。