簡體   English   中英

WPF ListBox ExtendedMode使用IsSelected綁定移動所選項目

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM