MVVM - 如何在运行时创建列的xamdatagrid?
-
26-09-2019 - |
题
我必须创建一个XamDataGrid该节目列的一时间帧x至y动态量。因此,我不知道用户将多少年选择让这些列上创建的前期。
现在usualy内MVVM你只需通过填充数据尽可能多的属性,你会你XamDataGrid内需要列,而后者只会自动生成他们。
很显然,我不能就这样在运行时创建我的视图模型中的属性,除非我做了一件疯狂的反思。
如何否则我会做到这一点?
我应该只是创建绑定字段的数据网格,并通过代码填充它们?我同意我不会需要一个双向的在这个阶段绑定,因为网格是唯一的只读......只是想大声。
时,在不违反MVVM模式这种方法好不好? 感谢
解决方案
可以使用索引:
在您的视图模型:
public MyVariableCollection RowData
{
get { return new MyVariableCollection(this); }
}
在MyVariableCollection
:
保护SomeRowViewModel视图模型;
public MyVariableCollection(SomeRowViewModel viewmodel)
{
this.viewModel = viewmodel;
}
public object this[string name]
{
get { return viewModel.GetRowColumnValue(name); }
}
我试图保持简短:但这个想法是,你有一个定义的索引一个新的类,然后你可以绑定是这样的:
{Binding Path=SomeRowViewModelInstance.RowData["ColumnName"]}
在数据网格控制的列集合将被结合 - 你可以设置为每列结合到所讨论的列的列模板;你不需要在这样的索引使用文本字符串。
希望提供一些精神食粮 - 这条线路上的任何疑问,请发表评论
编辑额外想法:我已经使用了内容ComponentModel
命名空间,以产生一个自定义TypeDescriptor
。这是相当深入,但你可以使物体“出现”具有额外的或自定义属性。这远远超过了索引方法我张贴以上,但如果你卡住它的值得一看的要复杂得多。
其他提示
我有类似的问题,因为用户能够在运行时定义网格的列。
我写含有XAM数据网格并且暴露一个DataSource依赖性属性来为网格模型绑定(即数据表)的控制。
每次源改变通过清除其DataSource和复位它(可以添加用于PropertyChanged事件侦听器和栅格FieldLayoutInitializing事件)网格进行动态重新渲染:
private void ReRenderGrid()
{
XamDataGrid.FieldLayouts.Clear();
XamDataGrid.ClearValue(DataPresenterBase.DataSourceProperty);
XamDataGrid.DataSource = DataSource.Data.DefaultView;
}
的列重新由在其上通过xamdatagrid栅格数据源后提出下面的事件的事件处理程序被配置为重置
XamDataGrid.FieldLayoutInitializing += LayoutInitializing;
处理程序:
private void LayoutInitializing(object sender, FieldLayoutInitializingEventArgs e)
{
const string deletebuttonstyle = "DeleteButtonStyle";
const string requiredinputvalue = "RequiredInputValue";
const string optionalinputvalue = "OptionalInputValue";
const string outputvalue = "OutputValue";
var fieldLayout = e.FieldLayout;
fieldLayout.Fields.Clear();
AddFields(DataSource.InColumns, requiredinputvalue, fieldLayout);
AddSplitter(fieldLayout);
AddFields(DataSource.OptionalInColumns, optionalinputvalue, fieldLayout);
AddSplitter(fieldLayout);
AddFields(DataSource.OutColumns, outputvalue, fieldLayout);
AddUnboundField(fieldLayout, string.Empty, GetStyle(deletebuttonstyle));
}
在我的情况下数据源包含在用户配置的所有列。 AddFields调用每个列表条目此方法:
private void AddField(string name, Style style, FieldLayout fieldLayout)
{
var field = new Field {Name = name};
field.Settings.LabelPresenterStyle = style;
field.Settings.CellValuePresenterStyle = GetStyle("StandardCellValueStyle");
fieldLayout.Fields.Add(field);
}
和AddSplitter被AddUnboundField以类似的方式实现。