MVVM - получить выбранные элементы из ListBox через привязку данных - PullRequest
0 голосов
/ 18 января 2020

Я пишу приложение, используя шаблон MVVM в C#.

Моя цель - получить выбранные элементы из ListBox в моем собственном пользовательском элементе управления.

Я создал привязываемый объект с методом чтобы изменить этот объект (вызывается при выборе чего-то нового):

public partial class MyUserControl : UserControl
{
    ...

    public IEnumerable SelectedItems
    {
        get { return (IEnumerable)GetValue(SelectedItemsProperty); }
        set { SetValue(SelectedItemsProperty, value); }
    }
    public static readonly DependencyProperty SelectedItemsProperty =
        DependencyProperty.Register("SelectedItems", typeof(IEnumerable),
            typeof(MyUserControl),
            new FrameworkPropertyMetadata(default(IEnumerable),
                FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));

    public MyUserControl ()
    {
        InitializeComponent();
    }

    private void SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        SelectedItems = ListBox.SelectedItems;
    }
}

Есть также часть Items, а в xaml часть ListBox называется ListBox:

<ListBox Name="ListBox" SelectionChanged="SelectionChanged" ... />

Вот так это выглядит на странице с ViewModel, в которой создается MyUserControl:

<uc:MyUserControl ... SelectedItems="{Binding Path=MyObjectItems}" />

И вот здесь возникает проблема. При установке SelectedItems во ViewModel:

private ObservableCollection<MyObject> _myObjectItems;

public ObservableCollection<MyObject> MyObjectItems
{
    get { return _myObjectItems; }
    set { _myObjectItems = value; }
}

Независимо от того, что я делаю, value всегда будет нулевым. Это также означает, что SelectedItems в MyUserControl также является нулевым.

Я могу, например, использовать OneWayToSource режим привязки:

<uc:MyUserControl ... SelectedItems="{Binding Path=MyObjectItems, Mode=OneWayToSource}" />

value по-прежнему равен нулю, так же, как MyObjectItems, но по крайней мере SelectedItems в MyUserControl содержит выбранные элементы. Недостаточно хорошо: /

1 Ответ

0 голосов
/ 26 января 2020

После нескольких часов проб разных подходов я нашел пакет NuGet Extended WPF Toolkit . Список SelectedItemsOverride из класса CheckListBox позволяет связать список выбранных элементов:

<UserControl x:Class="View.UserControls.MyUserControl"
             ...
             xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
             x:Name="Root">
   <Grid>
      <xctk:CheckListBox Name="ListBox"
          ItemSelectionChanged="SelectionChanged"
          SelectedItemsOverride="{Binding SelectedItems, ElementName=Root}"
          ... />
   </Grid>
</UserControl>

И поэтому привязка:

<uc:MyUserControl ... SelectedItems="{Binding Path=MyObjectItems}" />

работает! У меня есть доступ к выбранным элементам в View Model - все просто.

...