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>
我正在开发一个应用程序,我需要在其中显示服务的一些选项并从用户那里获取 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>