Multibinding XamDataGrid

本文关键字:XamDataGrid Multibinding | 更新日期: 2024-11-10 04:49:01

我正在尝试使用Infragistics站点中的以下代码示例,我希望XamDataCards中的编辑反映在XamDataGrid中。 但是,我的 XamDataGrid 数据源是我的 ViewModel 中的一个ObservableCollection<Companies>。 如何绑定到卡并将更新中继回 ViewModel 中的Companies对象?

<igDP:XamDataGrid x:Name="dgCompanies" Theme="IGTheme" DataSource="{Binding Companies}" SelectedDataItemsScope="RecordsOnly">
  <igDP:XamDataGrid.FieldSettings>
    <igDP:FieldSettings CellClickAction="SelectCell" AllowEdit="True"/>
  </igDP:XamDataGrid.FieldSettings>
</igDP:XamDataGrid>
<igDP:XamDataCards x:Name="XamDataCards1"
                       Grid.Row="1"
                       DataSource="{Binding Path=SelectedDataItems, ElementName=dgCompanies}"
                       Theme="IGTheme">

编辑:添加了视图模型

public class CompanyMgmtViewModel : ViewModelBase
{
    private ObservableCollection<Object> _Companies = null;
    public ObservableCollection<Object> Companies
    {
        get { return _Companies; }
        set
        {
            if (_Companies != value)
            {
                _Companies = value;
                RaisePropertyChanged(GetPropertyName(() => Companies));
            }
        }
    }
    public CompanyMgmtViewModel()
    {
        this.LoadData();
    }
    public void LoadData()
    {
        ObservableCollection<Object> records = new ObservableCollection<Object>();
        var results = from res in AODB.Context.TCompanies
                      select res;
        foreach (var item in results)
            if (item != null) records.Add(item);
        Companies = records;
    }
}

模型/上下文代码只是 EF 数据库首先生成的。

Multibinding XamDataGrid

您需要将 XamDataGrid 的 SelectedDataItems 属性绑定到类型为 object[] 的属性,即。视图模型中的选定公司,并绑定到 XamDataCard 数据源的该公司。

此线程中接受的答案有一个示例,演示如何执行此操作,尽管使用列表框而不是 XamDataCards:http://www.infragistics.com/community/forums/t/89122.aspx

只需将该列表框替换为 XamDataCard 控件,它就可以工作并更新 XamDataGrid。 示例中的 ViewModel 包含在 MainWindow 代码隐藏中,因此它是您想要的 MVVM。

更多信息:http://help.infragistics.com/Help/Doc/WPF/2014.1/CLR4.0/html/xamDataGrid_Selected_Data_Items.html

IG 的 SelectedDataItems 是一个对象[]:http://help.infragistics.com/Help/Doc/WPF/2014.1/CLR4.0/html/InfragisticsWPF4.DataPresenter.v14.1~Infragistics.Windows.DataPresenter.DataPresenterBase~SelectedDataItems.html

如果没有狄奥多西和加内什的输入,我不可能得到这个答案——所以多亏了他们,他们都有部分答案。

我首先尝试通过 ViewModel 上的属性将 XamDataGrid 的 SelectedDataItems 绑定到 XamDataCards,正如 Theodosius 所建议的那样,但这还不够。 感谢Ganesh,我通过继承MVVMLight中的ObservableObject在我的模型对象上实现了INotifyPropertyChanged(我怎么不知道模型需要这个?)。

以下是使其工作的相关代码段。我还实现了 PropertyChanged.Fody,如此处所述;这就是TypedViewModelBase<T>和删除RaisePropertyChanged()的来源。我还使用 LINQ/Automapper .Project().To<T>()调用创建我的模型对象,该调用可在此处找到。

 public class Company : ObservableObject
{
    public Company() { }
    public int id { get; set; }
    public string strName { get; set; }
    public string strDomicileCode { get; set; }
}

视图模型

public class CompanyMgmtViewModel : TypedViewModelBase<Company>
{
    private ObservableCollection<Object> _Companies = null;
    private Object[] _selectedCompany = null;
    public Object[] Company
    {
        get { return _selectedCompany; }
        set
        {
            if (_Company != value)
            {
                _selectedCompany = value;
            }
        }
    }
    public ObservableCollection<Object> Companies
    {
        get { return _Companies; }
        set
        {
            if (_Companies != value)
            {
                _Companies = value;
            }
        }
    }
    public CompanyMgmtViewModel()
    {
        this.LoadData();
    }
    public void LoadData()
    {
        ObservableCollection<Object> records = new ObservableCollection<Object>();
        var results = AODB.Context.TCompanies.Project().To<Company>();
        foreach (var item in results)
            if (item != null) records.Add(item);
        Companies = records;
    }
}

视图

<igDP:XamDataGrid   x:Name="dgCompanies" 
                Theme="IGTheme"  
                DataSource="{Binding Companies, Mode=OneWay}" 
                SelectedDataItemsScope="RecordsOnly" 
                SelectedDataItems="{Binding Company}">
                  ...
<igDP:XamDataCards x:Name="XamDataCards1"
                       Grid.Row="1"
                       DataSource="{Binding ElementName=dgCompanies, Path=SelectedDataItems}"
                       Theme="IGTheme">