WPF。列表框。如何将所选项目的最大值限制为2?

时间:2011-05-18 20:53:42

标签: c# .net wpf xaml listbox

我需要将ListBox中所选项目的数量限制为2.如何执行此操作?是否可以避免使用事件并在XAML中执行此操作?

3 个答案:

答案 0 :(得分:8)

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

您可以通过将SelectionMode设置为MultipleExtended(请参阅here了解差异)将ListBox设置为多选,并附加到{{1}事件。当事件被提出时,修改选择你认为合适的方式(你如何做到这将取决于你希望它如何工作......如果他们选择第三个,是否立即删除?或第一个获得删除 - 有效地删除FIFO或LIFO。)

修改

我的坏,我把错误的文章联系起来了。

答案 1 :(得分:1)

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

对于以下XAML中定义的ListView

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

答案 2 :(得分:1)

我做了一个这样的行为,我可以将我想要选择的元素数量绑定到dependencyproperty。

它是这样使用的,附在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);
        }
    }
}