C# 多绑定XamDataGrid
我正在尝试使用以下内容,我希望XamDataCards中的编辑反映在XamDataGrid中。但是,我的XamDataGrid数据源在我的ViewModel中是一个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">
可观测集合。如何也绑定到卡并将更新转发回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也是一个巧妙的添加。