WPF ListBox ExtendedMode使用IsSelected绑定移动所选项目

时间:2014-12-29 08:08:54

标签: c# wpf listbox

带有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");
            }
        }
    }
 }

1 个答案:

答案 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。