首页 > 解决方案 > 每个用户控件的不同 ItemsSource

问题描述

在我的窗口中,我有包含用户控件集合的 ListBox,例如:

<ListBox ItemsSource="{Binding UserControls}">

在用户控件类中,我有绑定到数据表的 DataGrid:

<DataGrid ItemsSource="{Binding TableResult}"/>

从窗口的视图模型中,我动态地将更多用户控件添加到 ListBox,例如:

void AddUserControl()
{
   MyUserControl uc = new MyUserControl
   {
     DataContext = this
   };
   UserControls.Add(uc);
}

现在所有用户控件都绑定到同一个表:TableResult

但我什么是每个用户控件的新数据表。

我试过像:

void AddUserControl()
{
   MyUserControl uc = new MyUserControl
   {
     DataContext = this
   };
   DataTable dt = new DataTable();
   uc.MyGridView.ItemsSource = dt.DefaultView;
   UserControls.Add(uc);
}

但现在新数据表将缺少这部分:

DataTable dt;
public DataTable Dt
{
    get { return dt; }
    set
    {
        dt = value;
        RaisePropertyChanged("Dt");
     }
}

注意:我的窗口只有一个视图模型,因此每个用户控件的数据上下文是相同的视图模型

对这个 secnario 有什么建议吗?我的意思是如何为每个新的用户控件绑定一个新的数据表

标签: wpfdatagrid

解决方案


你不应该绑定到IEnumerable<UserControl>. 在视图模型中引用 UI 元素或控件会破坏 MVVM 模式。

您应该做的是创建一个向其添加DataTable属性的类,然后绑定到IEnumerable<YourClass>. 实际UserControl应该在视图ItemTemplate中定义:ListBox

<ListBox ItemsSource="{Binding DataObjects}">
    <ListBox.ItemTemplate>
        <local:MyUserControl  />
    </ListBox.ItemTemplate>
</ListBox>

中的根元素从 in 中的当前项ItemTemplate继承,这意味着您可以直接绑定到in的任何公共属性:DataContextListBoxYourClassMyUserControl

<DataGrid ItemsSource="{Binding TableProperty}"/>

推荐阅读