observableCollection:如何在运行时建立类型?

时间:2012-06-05 14:49:53

标签: wpf observablecollection

我有一个dataGrid,它使用observableCollection来绑定ItemsSource属性(MVVM模式)。所以在我的viewmodel中,我有一个observableCollectionmyCollection)的属性。但是,这个dataGrid可以显示两种不同类型的信息,它们是在运行时决定的。

通常情况下,我在此处使用observableCollection:

ObservableCollection<myType> myCollection = new ObservableCollection<myType>();

但是现在,我有一个字符串作为参数,告诉我我需要什么类型,所以我想做类似的事情:

if(parameter == "TypeA")
{
    myCollection = new ObservableCollection<TypeA>();
}

if(parameter == "TypeB")
{
    myCollection = new ObservableCollection<TypeB>();
}

可以这样做吗?

2 个答案:

答案 0 :(得分:1)

如果使TypeA和TypeB派生自公共基类或接口,则可以保留相同的集合。

但是如果你想要两个不同的集合,你可以提高集合属性以通知有关更改的类型。

IEnumerable MyCollection
{
    get
    {
        if(CurrentType == typeof(TypeB)
            return myTypeBCollection;
        else if(CurrentType == typeof(TypeA)
            return myTypeACollection;
    }
}

所以你在视图中绑定MyCollection到ItemsSource,并提出该属性已经改变。

请记住,您可能需要一个不同的DataTemplate,其中DataTemplateSelector可能派上用场。

答案 1 :(得分:0)

在运行时使用动态关键字而不是确切类型来声明ObservableCollection

private ObservableCollection<dynamic> DynamicObservable(IEnumerable source)
    {

        ObservableCollection<dynamic> SourceCollection = new ObservableCollection<dynamic>();

        SourceCollection.Add(new MobileModelInfo { Name = "iPhone 4", Catagory = "Smart Phone", Year = "2011" });

        SourceCollection.Add(new MobileModelInfo { Name = "S6", Catagory = "Ultra Smart Phone", Year = "2015" });

        return SourceCollection;

    }

public class MobileModelInfo
{
    public string Name { get; set; }
    public string Catagory { get; set; }
    public string Year { get; set; }
}