[英]WPF ListBox ExtendedMode Move selected item with IsSelected binding
具有SelectionMode="Extended"
簡單ListBox綁定到具有IsSelected
屬性的視圖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");
}
}
}
}
您正在描述的行為來自此:
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="IsSelected" Value="{Binding IsSelected}" />
</Style>
</ListBox.ItemContainerStyle>
如果刪除它,它將起作用,例如,它將不會重復這些項目。 似乎它們是不兼容的。
如果解決方案似乎可行並且沒有任何問題,請繼續使用您的解決方案。
您還可以通過訂閱“ ObservableCollection.CollectionChanged”事件並偵聽Moved
動作來解決此問題,在該動作中您已經做過的事情類似。
或者,如果您願意稍作更改:即,您可以放棄“ TwoWay”綁定,以使其工作,如下所示:
<ListBox.ItemContainerStyle> <Style TargetType="{x:Type ListBoxItem}"> <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=OneWayToSource}" /> </Style> </ListBox.ItemContainerStyle>
這仍然會更新您的viewmodel IsSelected
屬性,但是在vm端更改它不會執行任何操作。 如果需要該功能,可以考慮通過接口/命令將其注入到視圖模型中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.