WPF.ListBox.Как ограничить максимум выбранных предметов до 2? - PullRequest
3 голосов
/ 19 мая 2011

Мне нужно ограничить количество выбранных элементов в ListBox до 2. Как это сделать?Можно ли избежать использования событий и сделать это в XAML?

Ответы [ 3 ]

8 голосов
/ 19 мая 2011

Насколько я знаю, нет встроенного способа сделать это, поэтому вам придется написать некоторый код.

Вы можете установить свой ListBox как множественный выбор, установив SelectionMode в Multiple или Extended (разницу см. здесь ) и присоединить к событию SelectionChanged. Когда событие поднято, измените выбор так, как считаете нужным (как вы это сделаете, это будет зависеть от того, как вы хотите, чтобы оно работало ... если они выберут третье, будет ли оно удалено сразу? Или первое получит удалено - эффективно удаляет FIFO или LIFO).

Edit:

Мое плохое, я ссылался не на ту статью.

1 голос
/ 22 октября 2014

Я сделал такое поведение, когда я могу привязать количество элементов, которые я хочу выбрать, к свойству зависимости.

Используется вот так, прилагается к 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);
        }
    }
}
1 голос
/ 29 марта 2014

Ниже приведен пример того, как ограничить выбор только двумя элементами

Для ListView, определенного в следующем 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);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...