首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MVVM -通过数据绑定从ListBox获取选定项

MVVM -通过数据绑定从ListBox获取选定项
EN

Stack Overflow用户
提问于 2020-01-19 04:45:01
回答 1查看 131关注 0票数 0

我在C#中使用MVVM模式编写应用程序。

我的目标是在我自己的用户控件中从ListBox中获取选定的项目。

我已经创建了bindable对象,并使用方法更改此对象(在选择新对象时调用):

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
<ListBox Name="ListBox" SelectionChanged="SelectionChanged" ... />

在创建MyUserControl的ViewModel页面中,它是这样的:

代码语言:javascript
运行
复制
<uc:MyUserControl ... SelectedItems="{Binding Path=MyObjectItems}" />

现在问题来了。在ViewModel中设置SelectedItems时:

代码语言:javascript
运行
复制
private ObservableCollection<MyObject> _myObjectItems;

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

无论我做什么,value总是为空。这也意味着,MyUserControl中的SelectedItems也是空的。

例如,我可以使用OneWayToSource绑定模式:

代码语言:javascript
运行
复制
<uc:MyUserControl ... SelectedItems="{Binding Path=MyObjectItems, Mode=OneWayToSource}" />

value仍为null,与MyObjectItems相同,但MyUserControl中的SelectedItems至少包含选定项。不够好:/

EN

回答 1

Stack Overflow用户

发布于 2020-01-26 06:16:48

在尝试了几个小时后,我发现了NuGet包Extended WPF Toolkit。来自类CheckListBox的List SelectedItemsOverride允许绑定所选项目的列表:

代码语言:javascript
运行
复制
<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>

正因为如此,绑定:

代码语言:javascript
运行
复制
<uc:MyUserControl ... SelectedItems="{Binding Path=MyObjectItems}" />

成功了!我有权访问视图模型中的选定项目-一切都以简单的方式进行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59804652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档