C# 多绑定XamDataGrid

C# 多绑定XamDataGrid,c#,wpf,xaml,infragistics,C#,Wpf,Xaml,Infragistics,我正在尝试使用以下内容,我希望XamDataCards中的编辑反映在XamDataGrid中。但是,我的XamDataGrid数据源在我的ViewModel中是一个可观测集合。如何也绑定到卡并将更新转发回ViewModel中我的公司对象 <igDP:XamDataGrid x:Name="dgCompanies" Theme="IGTheme" DataSource="{Binding Companies}" SelectedDataItemsScope="RecordsOnly">

我正在尝试使用以下内容,我希望XamDataCards中的编辑反映在XamDataGrid中。但是,我的XamDataGrid数据源在我的ViewModel中是一个
可观测集合。如何也绑定到卡并将更新转发回ViewModel中我的
公司
对象

<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">

编辑:添加了ViewModel

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;
    }
}
 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;
    }
}
public类公司ymgmtviewmodel:ViewModelBase
{
私有可观测集合_Companies=null;
公开募捐公司
{
获取{return\u companys;}
设置
{
如果(_公司!=价值)
{
_公司=价值;
RaisePropertyChanged(GetPropertyName(()=>公司));
}
}
}
上市公司GMTVIEWMODEL()
{
这是LoadData();
}
公共void LoadData()
{
ObservableCollection记录=新的ObservableCollection();
var results=来自AODB.Context.t公司中的res
选择res;
foreach(结果中的var项目)
if(item!=null)记录。添加(item);
公司=记录;
}
}

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

您需要将XamDataGrid的SelectedDataItems属性绑定到object[]类型的属性,即ViewModel中的SelectedCompanys,并绑定到XamDataCards数据源的属性

此线程中接受的答案有一个示例,演示了如何执行此操作,尽管使用的是列表框而不是XamDataCards:

只要用XamDataCards控件替换该列表框,它就会工作并更新XamDataGrid。示例中的ViewModel包含在MainWindow代码中,因此它是您想要的MVVM

更多信息:

IG的SelectedDataItems是一个对象[]:
没有狄奥多西和甘尼什的意见,我不可能得到这个答案——多亏了他们,他们都得到了部分答案

我首先尝试按照Theodosius的建议,通过ViewModel上的属性将XamDataGrid的SelectedDataItems绑定到XamDataCards,但这还不够。多亏了Ganesh,我在模型对象上实现了INotifyPropertyChanged,方法是继承MVVMLight中的ObserveObject(我怎么不知道模型需要这个?)

下面是使其工作的相关代码片段。 我还实现了PropertyChanged.Fody;这就是
TypedViewModelBase
和删除
RaisePropertyChanged()
的原因。 我还通过使用LINQ/Automapper
.Project().To()
调用来创建模型对象

型号

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;
    }
}
 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;
    }
}
视图模型

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;
    }
}
 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;
    }
}
public类公司ymgmtviewmodel:TypedViewModelBase
{
私有可观测集合_Companies=null;
私有对象[]\u selectedCompany=null;
公共对象[]公司
{
获取{return\u selectedCompany;}
设置
{
如果(_Company!=值)
{
_所选公司=价值;
}
}
}
公开募捐公司
{
获取{return\u companys;}
设置
{
如果(_公司!=价值)
{
_公司=价值;
}
}
}
上市公司GMTVIEWMODEL()
{
这是LoadData();
}
公共void LoadData()
{
ObservableCollection记录=新的ObservableCollection();
var results=AODB.Context.TCompanies.Project().To();
foreach(结果中的var项目)
if(item!=null)记录。添加(item);
公司=记录;
}
}
查看


...

您是否实现了INotifyPropertyChanged?是的,我正在使用MVVMLight来提高PropertyChanged。您能否共享视图模型代码和模型代码。INotifyPropertyChanged必须在您的模型类中实现。感谢Ganesh,您的输入帮助我得出了答案!如果您不希望这些卡片只是选定的项目(您想在XamDataCards中显示每个公司吗?),您只需将XamDataCards数据源绑定到绑定XamDataGrid的同一个集合即可)感谢Theodosius,您将我指向
Object[]
的方向帮助我找到了答案!MvvMLight有一个可以使用的ViewModelBase,其中已经包含INotifyPropertyChanged,如果您不知道的话,ViewModelBase继承自ObserveObject。Fody在清理所有重复的
RaisePropertyChanged
废话方面有点惊人。TypedViewModelBase也是一个巧妙的添加。