我试图将数据集绑定到列表框..当然,因为我想在datatemplate中显示几个表信息..但这似乎不可能,我将不得不将其转换为可观察的集合。但是如何我能做到。我的bl返回数据集对象。如何将其转换为observablecollection ..?有什么方法可以让我在MVVM中处理这种情况吗?人们如何处理MVVM架构中的数据集..?
答案 0 :(得分:2)
DataSet是一组表的.Net表示,以及它们之间的关系。它有点像内存代码可访问的迷你数据库表示。只有少数控件可以直接绑定到数据集 - 那些编码用于分析数据集表之间的关系,并在某种层次显示中表示各种表的数据(如树视图或层次网格)任何需要的数据集简单的项目列表,每个项目有一个或两个属性不能直接绑定到一个数据,它只能绑定到一个包含的数据表。
或者,您需要动态构造和填充您自己的数据表,从您正在使用的数据集中的各个表构造,以正确地为您要绑定它的特定控件提供服务。
答案 1 :(得分:2)
以下是将数据表转换为可观察集合的方法:
没有内置函数或强制转换可以将数据表转换为observablecollection
答案 2 :(得分:1)
以下是来自Datatable到ObservabaleColleaction的代码,正如@Hasan Fahim建议的......
DataTable dtValues = new DataTable();
dtValues.Columns.Add("Value1");
dtValues.Columns.Add("Value2");
dtValues.Columns.Add("Value3");
dtValues.Columns.Add("Value4");
DataRow dr = dtValues.NewRow();
dr["Value1"] = "asad";
dr["Value2"] = "naeeem";
dtValues.Rows.Add(dr);
ObservableCollection Values = new ObservableCollection<MyClass>
(dtValues.AsEnumerable().Select(i => new MyClass
{
Value1 = Convert.ToString(i["Value1"]),
Value2 = Convert.ToString(i["Value2"]),
Value3 = Convert.ToString(i["Value3"]),
Value4 = Convert.ToString(i["Value4"])
}));
答案 3 :(得分:0)
我还在努力,但是这样的事情怎么样:
public class cDTObservable<DTType, RowType> : ObservableCollection<RowType>
where DTType : DataTable
where RowType : DataRow
{
private DTType _dt;
public cDTObservable(DTType dt)
: base(dt.Rows.OfType<RowType>())
{
_dt = dt;
}
protected override void ClearItems()
{
_dt.Clear();
base.ClearItems();
}
protected override void InsertItem(int index, RowType item)
{
if (index > _dt.Rows.Count) throw new ArgumentOutOfRangeException("Argument is out of range");
if (index == _dt.Rows.Count)
_dt.Rows.Add(item);
else
_dt.Rows.InsertAt(item, index);
base.InsertItem(index, item);
}
protected override void MoveItem(int oldIndex, int newIndex)
{
if (oldIndex >= _dt.Rows.Count || newIndex >= _dt.Rows.Count)
throw new ArgumentOutOfRangeException("Argument is out of range");
int MyNewIndex = newIndex; //so that I don't override anything that goes to base.MoveItem
if (oldIndex < newIndex)
MyNewIndex--;
RowType dr = (RowType)_dt.Rows[oldIndex];
_dt.Rows.RemoveAt(oldIndex);
if (MyNewIndex == _dt.Rows.Count)
_dt.Rows.Add(dr);
else
_dt.Rows.InsertAt(dr, MyNewIndex);
dr = null;
base.MoveItem(oldIndex, newIndex);
}
protected override void RemoveItem(int index)
{
if (index >= _dt.Rows.Count) throw new ArgumentOutOfRangeException("Argument is out of range");
_dt.Rows[index].Delete(); //Or if you do not need the data to persist in your data store, simply _dt.Rows.RemoveAt(index);
base.RemoveItem(index);
}
protected override void SetItem(int index, RowType item)
{
if (index >= _dt.Rows.Count) throw new ArgumentOutOfRangeException("Argument is out of range");
_dt.Rows.RemoveAt(index);
if (index > _dt.Rows.Count - 1)
_dt.Rows.Add(item);
else
_dt.Rows.InsertAt(item, index);
base.SetItem(index, item);
}
}
这个想法是你从ObservableCollection继承而不是操纵数据的副本,而只是操纵对数据的引用。这样,当您的Row在数据表中更新时,它也将在您的ObservableCollection中更新(尽管不会触发ObservableCollection事件)。
由于泛型,这也适用于Typed DataTables,并允许您访问DataRow的属性(包括DataColumns)。
理论上,这也应该允许您使用ObservableCollection作为DataTable的代理来添加/删除/修改内容。
显然,由于我仍然在为我的项目工作,我完全有可能错过了一些重要的东西,但就在这一刻,我不明白为什么这不会起作用(因为我是非常确定Rows [Index] .Delete()设置DataRowState属性而不是实际删除DataRow对象。)