我的任何实体的通用ObservableCollection

时间:2013-02-18 07:43:42

标签: c# wpf mvvm observablecollection

我使用Entity Framework访问SQL Server上的数据,我需要在WPF DataGrid中显示我的SQL表格中的数据。我知道如何为我的任何实体执行此操作:我使用View创建DataGrid

<DataGrid ItemsSource="{Binding Rows}" SelectedItem="{Binding Row}" />

ViewModel ObservableCollection<PERSONS>作为公共财产:

public class DictionaryViewModel : ViewModelBase
{
    private ObservableCollection<PERSONS> rows;
    public ObservableCollection<PERSONS> Rows
    {
         get
         {
              return rows;
         }
         set
         {
              rows = value;
              RaisePropertyChanged("Rows");
         }
    }

    public DictionaryViewModel()
    {
        Rows = new ObservableCollection<PERSONS>(myDataContext.PERSONS);
    }
}

我的问题是如何为任意实体执行此操作?实体有通用类型吗?写这样的东西会很好:

public class DictionaryViewModel : ViewModelBase
{
    private ObservableCollection<GenericType> rows;
    public ObservableCollection<GenericType> Rows
    {
         get
         {
              return rows;
         }
         set
         {
              rows = value;
              RaisePropertyChanged("Rows");
         }
    }

    public DictionaryViewModel(GenericType type)
    {
        Rows = new ObservableCollection<type>(...);
    }
}

我真的不想为我拥有的每个实体创建单独的ViewModel

感谢。

3 个答案:

答案 0 :(得分:4)

为什么不简单地在你的班级中引入泛型参数?

public class DictionaryViewModel<T> : ViewModelBase
{
    private ObservableCollection<T> _rows;
    public ObservableCollection<T> Rows
    {
         get
         {
              return _rows;
         }
         set
         {
              _rows = value;
              RaisePropertyChanged("Rows");
         }
    }
}

您只需创建2个实例(一个用于Person,一个用于Department)并实现网关逻辑以绑定正确的源。

编辑:
如果你想使用一个不同类型的实例......别忘了!为PersonDepartment引入基类,您可以在其中定义公共属性并将此新类型用作通用约束。

答案 1 :(得分:2)

是的,你可以这样做。您只需使用Object代替Generic Type。您的代码可能如下所示

public class ViewModelBase
{
    // base class code
}

public class DictionaryViewModel : ViewModelBase
{

    public DictionaryViewModel()
    {
        Rows = new ObservableCollection<Object>();
    }

    private ObservableCollection<Object> rows;
    public ObservableCollection<Object> Rows
    {   
        get
        {
            return rows;
        }
        set
        {
            rows = value;
            RaisePropertyChanged("Rows");
        }
    }
}

现在Rows可以容纳任意实体。

答案 2 :(得分:0)

是的,有一个通用ObservableCollection<T>

<强> ObservableCollection<T> Class

public class DictionaryViewModel<T> : ViewModelBase
{
    private ObservableCollection<T> rows;
    public ObservableCollection<T> Rows
    {
         get
         {
              return rows;
         }
         set
         {
              rows = value;
              RaisePropertyChanged("Rows");
         }
    }

    public DictionaryViewModel(IEnumerable<T> collection)
    {
        Rows = new ObservableCollection<T>(collection);
    }
}

使用

DictionaryViewModel<Person> model =
                 new DictionaryViewModel<Person>(dataContext.Persons);