UWP 如何处理多选

UWP How to deal with multiple selections

我正在开发一个应用程序,我需要在其中显示服务的一些选项并从用户那里获取 select 其中一些项目的信息。为了实现这一点,我尝试将 ListView 与 SelectionMode="Multiple" 一起使用,但我发现这种方法存在一些问题。

在上图中,当用户从左侧面板 select 一个项目(从这里我将它们称为 "slots")时,selected 插槽的详细信息是显示在右侧面板中。我的问题来自处理 "handling types" 字段。如您所见,一个插槽可能有多种处理类型。我需要将 ListView 的 SelectedItems 属性 双向绑定到我的 ViewModel 中的某些 属性,但这是不可能的(顺便说一句,我遵循 MVVM 模式)。有一种方法可以从 ViewModel 设置 selected 项目,然后捕获用户可以返回我的 ViewModel 的任何其他 selection(或 deselection)。当然,我更喜欢干净简单的解决方案,但在这一点上,我们将不胜感激

我们无法将 Binding 分配给 UWP 中的只读 属性 SelectedItems

作为解决方法,我们可以在Class中定义IsSelected属性,Class应该继承INotifyPropertyChanged。

class代码:

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

我们可以把IsMultiSelectCheckBoxEnabled设为false,这样CheckBox就不会显示了。然后我们可以在DataTemplate中添加一个CheckBox控件,然后我们可以将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>