UWP Как работать с множественным выбором

Я разрабатываю приложение, в котором мне нужно представить некоторые параметры службы и зафиксировать выбор некоторых из этих элементов пользователем. Чтобы добиться этого, я попытался использовать ListView с SelectionMode="Multiple", но обнаружил некоторые проблемы с этим подходом.

Изображение приложения

На рисунке выше, когда пользователь выбирает элемент (отсюда я буду называть их «слоты») на левой панели, детали выбранного слота отображаются на правой панели. Моя проблема связана с полем «типы обработки». Как видите, у слота может быть много типов обработки. Мне нужно двусторонне привязать свойство SelectedItems ListView к некоторому свойству в моей ViewModel, но это невозможно (кстати, я следую шаблону MVVM). Есть способ установить выбранные элементы из ViewModel, а затем зафиксировать любой другой выбор (или отмену выбора), который пользователь может сделать, обратно в мою ViewModel. Конечно, я бы предпочел чистое простое решение, но на данный момент любое предложение будет оценено.


person Wacho    schedule 09.05.2017    source источник
comment
Рассматривали ли вы возможность использования события selectionChanged в listView? Судя по всему, это похоже на задачу события selectionChanged. Если нет, не могли бы вы уточнить или предоставить демонстрационный образец приложения или что-то вроде кода, GIF или YouTubeVid того, чего вы пытаетесь достичь? Это поможет нам найти лучшее решение   -  person iam.Carrot    schedule 09.05.2017


Ответы (1)


Мы не можем назначить Binding свойству только для чтения SelectedItems в UWP.

В качестве обходного пути мы можем определить свойство IsSelected в классе, класс должен наследовать INotifyPropertyChanged.

Код класса:

public class Bundle : INotifyPropertyChanged
{
    private string _name;
    private bool _isSelected;

    public string Name
    {
        get { return _name; }
        set
        {
            _name = value;
            RaisePropertyChanged("Name");
        }
    }

    public bool IsSelected
    {
        get { return _isSelected; }
        set
        {
            _isSelected = value;
            RaisePropertyChanged("IsSelected");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChanged(string name)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(name));
        }
    }
}

Мы можем установить false для IsMultiSelectCheckBoxEnabled, чтобы CheckBox не отображалось. Затем мы можем добавить элемент управления CheckBox в DataTemplate, затем мы можем привязать свойство IsChecked к IsSelected.

Например:

<ListView Name="MyListView" SelectionMode="Multiple"  IsMultiSelectCheckBoxEnabled="False">
    <ListView.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <CheckBox IsChecked="{Binding IsSelected,Mode=TwoWay}"></CheckBox>
                <TextBlock Text="{Binding Name}" ></TextBlock>
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>
person Jayden    schedule 10.05.2017
comment
Это работает очень хорошо, хотя при таком подходе кажется, что атрибуты SelectionMode и IsMultiSelectCheckBoxEnabled не нужны. - person Wacho; 11.05.2017