1

我正在使用 MVVM 框架创建一个 WPF 应用程序。

我有几个类都继承自基类“MessageParentBase”

public class ChatMessage : MessageParentBase
{
}

public class CargoMessage : MessageParentBase
{
}

ViewModel 都再次从基类“ParentMessageWindowBaseViewModel”继承

public class UserControlChatViewModel : ParentMessageWindowBaseViewModel
{
}

public class UserControlCargoViewModel : ParentMessageWindowBaseViewModel
{
}

现在我想做的是在我的“ParentMessageWindowBaseViewModel”类中有一个可观察的集合

abstract internal ObservableCollection<MessageParentBase> GridData
{
    get; set;
}

在那里,我可以在“ParentMessageWindowBaseViewModel”级别有一个通用方法,但是在子类中我希望声明一个更具体的集合

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

Visual Studio 告诉我它必须声明为“MessageParentBase”类型。

有人可以向我解释一下我目前正在努力实现这一目标。

非常感谢您的帮助。

4

2 回答 2

2

ObservableCollection< ChatMessage>与ObservableCollection < MessageParentBase>不同,因此您无法覆盖它。

你可以这样使用:

public class MessageParentBase
{
}

public class ChatMessage : MessageParentBase
{
}

public abstract class ParentMessageWindowBaseViewModel<T> where T : MessageParentBase
{
    abstract internal ObservableCollection<T> GridData
    {
        get;
        set;
    }
}

public class Child : ParentMessageWindowBaseViewModel<ChatMessage>
{

    internal override ObservableCollection<ChatMessage> GridData
    {
        get;
        set;
    }
}

但是不可能将所有 Childs 存储在 1 个列表中。所以它不会解决泛型属性的继承问题。

于 2013-08-09T09:16:38.417 回答
0

在你声明属性 GridData的类中abstract,为什么还要在那里引入一个支持字段 _GridData?不要那样做。

如果您希望该属性是abstract,请不要在那里放置任何支持字段。如果要在“高”级别(基类)实现属性,请abstract从中删除修饰符。

于 2013-08-09T08:58:16.423 回答