MVVM - 如何在运行时为xamdatagrid创建列?

Hou*_*man 6 .net wpf mvvm xamdatagrid

我必须创建一个XamDataGrid,它显示时间范围x到y的动态数量的列.因此,我不知道用户会选择多少年来预先创建这些列.

现在通常在MVVM中,您只需通过XamDataGrid中需要Columns的多个Properties填充数据,后者只需自动生成它们.

显然我不能在运行时在我的ViewModel中创建属性,除非我用Reflection做了一些疯狂的事情.

我怎么能做到这一点?

我应该只为数据网格创建未绑定的字段并通过代码填充它们吗?我同意在这个阶段我不需要双向绑定,因为网格只是只读...只是大声思考.

这种方法是否可以不违反MVVM模式?谢谢

Kie*_*one 5

您可以使用索引器:

在您的视图模型中:

public MyVariableCollection RowData
{
    get { return new MyVariableCollection(this); }
}
Run Code Online (Sandbox Code Playgroud)

MyVariableCollection: protected SomeRowViewModel viewModel;

public MyVariableCollection(SomeRowViewModel viewmodel)
{
    this.viewModel = viewmodel;
}

public object this[string name]
{
    get { return viewModel.GetRowColumnValue(name); }
}
Run Code Online (Sandbox Code Playgroud)

我试图保持简短:但这个想法是,你有一个定义了索引器的新类,然后你可以像这样绑定:

{Binding Path=SomeRowViewModelInstance.RowData["ColumnName"]}
Run Code Online (Sandbox Code Playgroud)

数据网格控件上的列集合将被绑定 - 您可以为每列设置一个列模板以绑定到相关列;您不需要像那样在索引器中使用文字字符串。

希望能提供一些思考 - 关于这条路线的任何问题,请发表评论。


编辑一个额外的想法:我已经使用内容ComponentModel命名空间来生成自定义TypeDescriptor. 它相当深入,但您可以使对象“看起来”具有附加或自定义属性。它比我上面发布的索引器方法复杂得多,但如果您遇到困难,值得一看。