可湿性工作基金会.列表框.如何将所选项目的最大数量限制为 2

本文关键字:最大数 项目 选项 列表 基金会 工作 可湿性 | 更新日期: 2023-09-27 17:56:46

我需要将列表框中所选项目的数量限制为 2。怎么做?是否可以避免使用事件并在 XAML 中执行此操作?

可湿性工作基金会.列表框.如何将所选项目的最大数量限制为 2

据我所知,没有内置的方法可以做到这一点,所以你将不得不编写一些代码。

通过将 SelectionMode 设置为 MultipleExtended,可以将 ListBox 设置为多选(有关差异,请参阅此处)并附加到SelectionChanged事件。引发事件时,修改您认为合适的选择(如何执行此操作取决于您希望它如何工作......如果他们选择第三个,它会立即被删除吗?还是第一个被删除 - 有效地去除 FIFO 或 LIFO)。

编辑:

我的错,我链接到了错误的文章。

我做了一个行为,我可以将我想要选择的元素数量绑定到依赖项属性。

它是这样使用的,附在ListView

<i:Interaction.Behaviors>
    <behaviors:LimitSelectionBehavior Limit="2" />
</i:Interaction.Behaviors>

这是行为类。可以修改Remove以取消选择Limit,现在它只是取消选择所有新添加的。

public class LimitSelectionBehavior : Behavior<ListView>
{
    public static readonly DependencyProperty LimitProperty;
    static LimitSelectionBehavior()
    {
        LimitProperty = DependencyProperty.Register("Limit", typeof(int), typeof(LimitSelectionBehavior), new PropertyMetadata(default(int)));
    }
    public int Limit
    {
        get { return (int) GetValue(LimitProperty); }
        set { SetValue(LimitProperty, value); }
    }
    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.SelectionChanged += OnSelectionChanged;
    }
    protected override void OnDetaching()
    {
        base.OnDetaching();
        AssociatedObject.SelectionChanged -= OnSelectionChanged;
    }
    private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (AssociatedObject.SelectedItems.Count <= Limit)
            return;
        foreach (var added in e.AddedItems)
        {
            AssociatedObject.SelectedItems.Remove(added);
        }
    }
}

下面是如何将选择限制为仅两个项目的示例

对于以下 XAML 中定义的列表视图

  <ListView x:Name="MyListView" ItemsSource="{Binding Path=ParentSection.MyListItems}" BorderThickness="0"
                SelectionMode="Multiple" ScrollViewer.HorizontalScrollBarVisibility="Hidden" 
                mvvm:FrameworkElementBehaviors.IgnoreMouseWheel="True" 
                SelectionChanged="MyListView_SelectionChanged">
    <ListView.View>
    <!--Your list view content here -->
    </ListView.View>
  </ListView>

该事件将如下所示

    public void MyListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (this.MyListView.SelectedItems.Count > 2)
        {
            this.MyListView.SelectedItems.RemoveAt(0);
        }
    }