在我的窗口中,我有一个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绑定一个新的数据表
答案 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