Я пишу приложение, используя шаблон 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
содержит выбранные элементы. Недостаточно хорошо: /