将Observable Collection从基类转换为继承类

时间:2013-02-15 17:36:04

标签: wpf c#-4.0

我正在编写一个WPF应用程序,我目前正在将一些重用的代码重构为我的其他视图模型可以继承的基础ViewModel类。

此基类的一个属性字段是

public class MessageParentBase
{
  MessageParentBase() {}

  public string Name;
}

internal ObservableCollection<MessageParentBase> _GridData = new ObservableCollection<MessageParentBase>();

我有后续的财产声明

public ObservableCollection<MessageParentBase> GridData
    {
        get { return _GridData; }
        set { _GridData = value; }
    }

这很有效,我的问题是所有的类实际上都使用了跟随类

Public class ChatMessage : MessageParentBase
{
    public string Message;
}

并且视图包含绑定到此GridData属性的数据网格,但应该绑定到ChatMessage类的Message字段的列为空,并且填充了MessageParentBase类中的字段。

所以我认为视图中存在一个问题,即不知道从MessageParentBase类转换到ChatMessage。

我是否可以通知视图对象的类型为“ChatMessage”。

我确实尝试将属性声明移动到继承的viewmodel

public ObservableCollection<ChatMessage> GridData
    {
        get { return _GridData; }
        set { _GridData = value; }
    }

但是这给了我以下错误: -

无法将类型'System.Collections.ObjectModel.ObservableCollection'隐式转换为'System.Collections.ObjectModel.ObservableCollection'

我是否需要在视图级别进行强制转换,还是可以更改视图模型以更好地实现此目的?

任何建议都将不胜感激。

埃姆林

2 个答案:

答案 0 :(得分:0)

将集合更改为:

public ObservableCollection<MessageParentBase> GridData { get; set; }

然后添加到您的构造函数

this.GridData = new ObservableCollection<MessageParentBase>();

由于WPF使用反射从数据上下文中检索绑定数据,因此它应该能够获取存储在该集合中的派生类的值。

当您运行应用程序时,选中Debug选中输出窗口,XAML引擎将在那里输出任何绑定错误。

答案 1 :(得分:0)

您的ViewModel应包含一个列表,其中包含您的网格将显示的类型(在本例中为ChatMessage类型)。您仍然可以使用继承来调用常用方法,但绑定列表必须是ChatMessage类型