我在C#中使用MVVM模式编写应用程序。
我的目标是在我自己的用户控件中从ListBox中获取选定的项目。
我已经创建了bindable对象,并使用方法更改此对象(在选择新对象时调用):
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 part,在xaml part中,ListBox被命名为ListBox:
<ListBox Name="ListBox" SelectionChanged="SelectionChanged" ... />
在创建MyUserControl的ViewModel页面中,它是这样的:
<uc:MyUserControl ... SelectedItems="{Binding Path=MyObjectItems}" />
现在问题来了。在ViewModel中设置SelectedItems时:
private ObservableCollection<MyObject> _myObjectItems;
public ObservableCollection<MyObject> MyObjectItems
{
get { return _myObjectItems; }
set { _myObjectItems = value; }
}
无论我做什么,value
总是为空。这也意味着,MyUserControl
中的SelectedItems
也是空的。
例如,我可以使用OneWayToSource
绑定模式:
<uc:MyUserControl ... SelectedItems="{Binding Path=MyObjectItems, Mode=OneWayToSource}" />
value
仍为null,与MyObjectItems
相同,但MyUserControl
中的SelectedItems
至少包含选定项。不够好:/
发布于 2020-01-26 06:16:48
在尝试了几个小时后,我发现了NuGet包Extended WPF Toolkit。来自类CheckListBox
的List SelectedItemsOverride
允许绑定所选项目的列表:
<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}" />
成功了!我有权访问视图模型中的选定项目-一切都以简单的方式进行。
https://stackoverflow.com/questions/59804652
复制相似问题