使用SelectionMode =“Multiple”和BindableSelection扩展将嵌套ListBox中的选定项绑定

时间:2016-01-19 14:52:08

标签: c# xaml mvvm data-binding windows-phone-8.1

我正在开发一个带MVVM模式的Windows Phone 8.1应用程序(我使用Prism作为框架)

目标是将选定的项目放在几个列表中,例如:

enter image description here

我关注XAML:

    <ListView 
    x:Name="abc"
    ItemsSource="{Binding Symbols}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <ListBox
                    SelectionMode="Multiple"
                    ItemsSource="{Binding List}"
Extensions:ListViewExtensions.BindableSelection="{Binding SelectedItems, ElementName=abc, Mode=TwoWay}">
                    ...

并在ViewModel中:

    public List<SymbolsGroupViewModel> Symbols {
        get { return _symbols ?? (_symbols = _dataService.Symbols.GetGroupViewModels()); }
        set { _symbols = value; }
    }

SymbolsGroupViewModel看起来像这样:

public class SymbolsGroupViewModel : ViewModel
{
    private readonly INavigationService _navigationService;
    private readonly DataService _dataService;

    private ObservableCollection<Symbol> _selectedItems = new ObservableCollection<Symbol>();

    public SymbolsGroupViewModel(INavigationService navigationService, DataService dataService)
    {
        _navigationService = navigationService;
        _dataService = dataService;
    }

    public SymbolsGroupViewModel() { }

    public Symbol Header { get; set; }

    public List<Symbol> List { get; set; }

    public ObservableCollection<Symbol> SelectedItems
    {
        get { return _selectedItems; }
        set { SetProperty(ref _selectedItems, value); }
    }
}

应该使用WinRT XAML Toolkit中的BindableSelection扩展名,如下所示: https://stackoverflow.com/a/25430935/5194338

它适用于非嵌套列表,但是当我将解决方案调整为嵌套列表时,SelectedItems列表包含0个元素。

有人知道是否可以在嵌套列表中使用此扩展名,如果是,我做错了什么?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我发现错误在哪里,所以我会留下答案以防万一有类似的问题......

在嵌套列表中,绑定应该写成如下:

Extensions:ListBoxExtensions.BindableSelection="{Binding SelectedItems, Mode=TwoWay}"
  • 给那里ElementName是一个坏主意
  • 我之前没有注意到,每种列表都有单独的扩展名。就我而言,我应该使用ListBoxExtensions

希望这将有助于将来。