【问题标题】:How to bind XamDataGrid to Model Properties through ViewModel如何通过 ViewModel 将 XamDataGrid 绑定到模型属性
【发布时间】:2013-04-19 14:42:29
【问题描述】:

在我的 C#/WPF 应用程序中,我正在尝试将 Infragistics WPF XamDataGrid 绑定到 ObservableCollection。 MyViewModel 公开 Model 属性。当我将要显示其值的属性添加到 MyViewModel 时,一切正常。下面显示了一个示例,其中我绑定到由 UnitsOfMeasure ObservableCollection 中包含的 MyViewModel 实例公开的 UnitID 属性。

如果我将“Name”更改为“Model.Name”,在运行时数据网格中会显示正确的行数,但所有字段都是空白的。不会引发运行时错误。

我的解决方法是将每个属性添加到 MyViewModel 并在每个 getter 和 setter 中引用模型中的属性。造成冗余代码,不同意 Laurent 的演示。

此 xaml 有效:

<igEditors:XamDataGrid Theme="Royale" Grid.Column="2" Grid.Row="1" HorizontalAlignment="Stretch" Margin="2" Name="xamDataGridUnitsOfMeasure" DataSource="{Binding Path=UnitsOfMeasure}"  VerticalAlignment="Stretch">
    <igEditors:XamDataGrid.FieldLayoutSettings>
        <igEditors:FieldLayoutSettings AutoGenerateFields="False"/>
            </igEditors:XamDataGrid.FieldLayoutSettings>
                <igEditors:XamDataGrid.FieldLayouts>
                    <igEditors:FieldLayout IsDefault="True">
                        <igEditors:FieldLayout.Fields>
                           <igEditors:Field Name="UnitID" Label="UOM ID">
                              <igEditors:Field.Settings>
                                 <igEditors:FieldSettings AllowEdit="False"/>
                              </igEditors:Field.Settings>
                           </igEditors:Field>
  .
  .
  .

将 UnitID 更改为 Model.UnitID 不起作用:

<igEditors:XamDataGrid Theme="Royale" Grid.Column="2" Grid.Row="1" HorizontalAlignment="Stretch" Margin="2" Name="xamDataGridUnitsOfMeasure" DataSource="{Binding Path=UnitsOfMeasure}"  VerticalAlignment="Stretch">
    <igEditors:XamDataGrid.FieldLayoutSettings>
        <igEditors:FieldLayoutSettings AutoGenerateFields="False"/>
            </igEditors:XamDataGrid.FieldLayoutSettings>
                <igEditors:XamDataGrid.FieldLayouts>
                    <igEditors:FieldLayout IsDefault="True">
                        <igEditors:FieldLayout.Fields>
                           <igEditors:Field Name="Model.UnitID" Label="UOM ID">
                              <igEditors:Field.Settings>
                                 <igEditors:FieldSettings AllowEdit="False"/>
                              </igEditors:Field.Settings>
                           </igEditors:Field>
  .
  .
  .

下面是 ViewModel 的功能部分:

public class UnitOfMeasureViewModel : ViewModelBase
{
    /// <summary>
    /// Initializes a new instance of the UnitOfMeasureViewModel class.
    /// </summary>
    public UnitOfMeasureViewModel(UnitOfMeasure model)
    {
        Model = model;
        //Model.PropertyChanged += (s, e) =>
        //    {
        //        RaisePropertyChanged(e.PropertyName);
        //    };
    }

    public UnitOfMeasure Model
    {
        get;
        private set;
    }

    public string UnitID
    {
        get
        {
            return Model.UnitID;
        }

        set
        {
            Model.UnitID = value;
        }
    }

【问题讨论】:

    标签: wpf xaml binding mvvm-light xamdatagrid


    【解决方案1】:

    XamGrid 控件支持嵌套绑定 - http://help.infragistics.com/Help/NetAdvantage/WPF/2012.1/CLR4.0/html/xamGrid.html

    或者

    参考这个Infragistics帮助链接-http://www.infragistics.com/community/forums/t/67603.aspx

    这将帮助您进行嵌套绑定

    否则 => 是否要从 Model 对象类中提取接口并尝试在以 Model 为属性的类中实现它?

     public interface IModel
        {
            public string UnitId { get; set; }
        }
    
        public class Model : IModel
        {
            private string unitId;
            public string UnitId
            {
                get { return unitId; }
                set { unitId = value; }
            }
        }
    
        public class ModelParent : IModel
        {
            private Model model;
            public string UnitId
            {
                get { return model.UnitId; }
                set { model.UnitId = value; }
            }
        }
    

    【讨论】:

    • 我还没有尝试过,但它似乎比仅仅向视图模型添加传递方法更多的工作。尤其是随着网格大小的增长。我只展示了一列,但是这个集合暴露了 6 个或 7 个,我还有其他要求,有 10 个或更多。
    • XamGrid 支持嵌套绑定,但 XamDataGrid 不支持,对吗?基于这个假设,我会接受从 Model 对象中提取接口作为答案。
    • 是的,而且 +1 => 当人们得到他们的答案、接受并且不给你分数时,这并不酷。
    猜你喜欢
    • 2016-05-03
    • 1970-01-01
    • 2011-08-26
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 2017-12-28
    • 2011-08-01
    相关资源
    最近更新 更多