我必须创建一个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以类似的方式实现。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top