2017-05-09 95 views
0

我正在开发一个应用程序,我需要从服务中提供一些选项并捕获用户对这些项目中的一些项目的选择。为了达到这个目的,我试着用SelectionMode =“Multiple”来使用ListView,但是我发现这种方法有些麻烦。UWP如何处理多个选择

Application picture

在上图中,当用户选择一个项目(从这里,我将其称为“槽”)从左侧面板,所选择的槽的细节被示出在右侧面板。我的问题来处理“处理类型”字段。正如你所看到的,一个插槽可能有许多处理类型。我需要双向绑定ListView的SelectedItems属性到我的ViewModel中的某个属性,但这是不可能的(顺便说一下,我遵循MVVM模式)。有一种方法可以从ViewModel中设置选定的项目,然后捕获用户可以返回到ViewModel的任何其他选择(或取消选择)。当然,我宁愿一个简单的解决方案,但在这一点上,任何建议,将不胜感激

+0

你有没有考虑过使用ListView控件的SelectionChanged事件?从外观上看,它看起来像一个selectionChanged事件任务。如果没有,请您详细说明或提供一个演示样本应用程序或代码或GIF或YouTubeVid,试图实现您的目标?它可以帮助我们提供更好的解决方案 –

回答

0

我们不能将Binding分配到UWP中的只读属性SelectedItems

作为一个工具,我们可以在类中定义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,以使CheckBox将不会显示的IsMultiSelectCheckBoxEnabled。然后我们可以在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> 
+0

这很好,虽然采用这种方法似乎不需要SelectionMode和IsMultiSelectCheckBoxEnabled属性 – Wacho

相关问题