wpf - 每个用户控件的不同 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 有什么建议吗?我的意思是如何为每个新的用户控件绑定一个新的数据表
解决方案
你不应该绑定到IEnumerable<UserControl>
. 在视图模型中引用 UI 元素或控件会破坏 MVVM 模式。
您应该做的是创建一个向其添加DataTable
属性的类,然后绑定到IEnumerable<YourClass>
. 实际UserControl
应该在视图ItemTemplate
中定义:ListBox
<ListBox ItemsSource="{Binding DataObjects}">
<ListBox.ItemTemplate>
<local:MyUserControl />
</ListBox.ItemTemplate>
</ListBox>
中的根元素从 in 中的当前项ItemTemplate
继承,这意味着您可以直接绑定到in的任何公共属性:DataContext
ListBox
YourClass
MyUserControl
<DataGrid ItemsSource="{Binding TableProperty}"/>
推荐阅读
- javascript - 如何控制“日期”输入小部件的“onchange”事件?
- php - 从事件订阅者重定向
- javascript - 使用 jquery 或 javascript 为父子属性创建手风琴式下拉菜单
- android - 如何在 Firebase ML kit Android 中正确绘制检测到的面部边界框?
- web-scraping - 在登录页面中使用 FormRequest 登录没有任何效果(重定向 302)
- python - python - 如何使用shutil.make_archive()在python中创建没有文件扩展名的zip存档?
- python - 在 div 类下抓取子 div
- firebase - 从 Flutter 中的 firebase 提取数据时,我无法访问数据
- typescript - 在 Typescript 中的表达式之后的方括号
- javascript - 页面加载后幻灯片轮播不起作用