将数据集转换为可观察的集合

时间:2010-01-07 19:37:59

标签: wpf mvvm listbox dataset

我试图将数据集绑定到列表框..当然,因为我想在datatemplate中显示几个表信息..但这似乎不可能,我将不得不将其转换为可观察的集合。但是如何我能做到。我的bl返回数据集对象。如何将其转换为observablecollection ..?有什么方法可以让我在MVVM中处理这种情况吗?人们如何处理MVVM架构中的数据集..?

4 个答案:

答案 0 :(得分:2)

DataSet是一组表的.Net表示,以及它们之间的关系。它有点像内存代码可访问的迷你数据库表示。只有少数控件可以直接绑定到数据集 - 那些编码用于分析数据集表之间的关系,并在某种层次显示中表示各种表的数据(如树视图或层次网格)任何需要的数据集简单的项目列表,每个项目有一个或两个属性不能直接绑定到一个数据,它只能绑定到一个包含的数据表。

或者,您需要动态构造和填充您自己的数据表,从您正在使用的数据集中的各个表构造,以正确地为您要绑定它的特定控件提供服务。

答案 1 :(得分:2)

以下是将数据表转换为可观察集合的方法:

  1. 您需要创建一个包含属性的类。每个属性代表一列 数据表。因此,您需要将属性类型设置为数据表中的列类型。
  2. 接下来,在View模型中创建一个属性,您希望在该模型中绑定xaml中的任何控件。此属性的类型为ObservableCollection。您可以将此属性绑定到网格。对于Listbox,您可以创建一个ObservableCollection字符串并将其绑定到列表框。
  3. 您可以使用LINQ直接在Observable集合中填充DB的结果,或者您也可以从datatable手动添加ObservableCollection中的项目。
  4. 没有内置函数或强制转换可以将数据表转换为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对象。)