0

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

此基类上的一个 Property 字段是

public class MessageParentBase
{
  MessageParentBase() {}

  public string Name;
}

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

我有一个后续的财产声明

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

这很好用,我的问题是 inerited 类实际上使用了 follow 类

Public class ChatMessage : MessageParentBase
{
    public string Message;
}

并且视图包含一个绑定到此 GridData 属性的数据网格,但应该绑定到 ChatMessage 类的 Message 字段的列是空白的,并且在 MessageParentBase 类中找到的字段被填充。

所以我认为视图不知道从 MessageParentBase 类转换为 ChatMessage 存在问题。

我可以通知视图对象将属于“ChatMessage”类型。

我确实尝试将属性声明移动到继承的视图模型

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

但这给了我以下错误:-

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

我需要在视图级别进行投射还是可以更改视图模型以更好地实现这一点?

任何建议将不胜感激。

埃姆林

4

2 回答 2

0

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

于 2013-02-15T18:43:26.100 回答
0

将集合更改为:

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

然后添加到您的构造函数中

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

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

此外,当您运行应用程序时,检查选择了“调试”的输出窗口,XAML 引擎将在那里输出任何绑定错误。

于 2013-02-15T17:49:02.740 回答