2

Entity Framework用来访问我的数据SQL Server,我需要在WPF DataGrid. 我知道如何为我的任何实体做到这一点:我创建了一个Viewwith 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为我拥有的每个实体创建一个单独的实体。

谢谢。

4

3 回答 3

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)并实现网关逻辑以绑定正确的源。

编辑:
如果你想使用一个不同类型的实例......算了吧!为您定义公共属性的地方引入一个基类,Person并将Department这个新类型用作您的泛型约束。

于 2013-02-18T08:35:58.550 回答
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 可以包含任意实体。

于 2013-02-18T08:00:10.140 回答
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);
于 2013-02-18T07:47:41.540 回答