每个用户控件的不同ItemsSource

时间:2019-08-14 11:09:12

标签: wpf datagrid

在我的窗口中,我有一个ListBox,其中包含如下用户控件的集合:

<ListBox ItemsSource="{Binding UserControls}">

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

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

从窗口的视图模型中,我向列表框动态添加更多用户控件,例如:

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");
     }
}

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

对此安全性有何建议?我的意思是我该如何为每个新的usercontrol绑定一个新的数据表

1 个答案:

答案 0 :(得分:1)

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

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

ListBox

<ListBox ItemsSource="{Binding DataObjects}"> <ListBox.ItemTemplate> <local:MyUserControl /> </ListBox.ItemTemplate> </ListBox> 中的根元素从ItemTemplate中的当前项继承其DataContext,这意味着您可以直接绑定到{中的ListBox的任何公共属性。 {1}}:

YourClass
相关问题