【问题标题】:WPF ListBox ExtendedMode Move selected item with IsSelected bindingWPF ListBox ExtendedMode 使用 IsSelected 绑定移动所选项目
【发布时间】:2014-12-29 08:08:53
【问题描述】:

带有SelectionMode="Extended" 的简单列表框绑定到带有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。通过这种方式增加该计数器后,当您在列表框中选择随机项时,它会减一。

为什么 SelectedItems 会累积移动的项目并且有修复?

视图模型:

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

【问题讨论】:

  • listItems 是什么类型? Move 是什么?
  • 你还没有显示Move是什么。
  • 是 ObservableCollection.Move
  • 明白了。在这种情况下,您希望的行为是什么?您想在这里实现什么目标?
  • 我想使用 gong dragdrop 移动 ListBox 中的项目。它在内部usesLsitBox.SelectedItems,在这里我遇到了这种奇怪的行为。期望的行为 - SelectedItems 包含实际选择的项目。

标签: c# wpf listbox


【解决方案1】:

您所描述的行为来自于此:

<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 端更改它不会做任何事情。如果您需要该功能,您可以考虑通过接口/命令将其注入视图模型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-11
    • 2010-09-20
    • 2021-01-23
    相关资源
    最近更新 更多