2013-02-15 3 views
0

Я пишу приложение WPF, и в настоящее время я реорганизую некоторый многократно используемый код в базовый класс ViewModel, который могут наследовать мои другие модели viewmodel.Коллекция Cast Observable из базового класса в унаследованный класс

Одно поле недвижимости на этом базовом классе

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 классы фактически использовать класс последующих

Public class ChatMessage : MessageParentBase 
{ 
    public string Message; 
} 

и вид содержит сетку данных, которая является bo und к этому свойству GridData, но столбец, который должен быть привязан к полю Message из класса ChatMessage, пуст, и поля, найденные в классе MessageParentBase, заполняются.

Таким образом, я предполагаю, что существует проблема с представлением, не зная, что он должен перейти к ChatMessage из класса MessageParentBase.

Могу ли я сообщить, что объекты будут иметь тип «ChatMessage».

я подвигайте объявление свойства до унаследованной ViewModel, как

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

, но это дает мне следующую ошибку: -

Не может неявно преобразовать тип «System.Collections.ObjectModel.ObservableCollection» to 'System.Collections.ObjectModel.ObservableCollection'

Нужно ли снимать на уровне представления или я могу изменить режимы просмотра, чтобы реализовать это лучше?

Любые предложения были бы весьма полезными.

Emlyn

+0

Что вы подразумеваете под * cast на уровне просмотра *? Вы привязываете базовую модель просмотра и хотите показать свойства ChatMessage? Ваш вопрос непонятен. Покажите нам, что/как вы привязываете модель представления к представлению. – Joao

+0

Также покажите класс messageParentBase. В его нынешнем виде ваш вопрос трудно выполнить. –

+0

Надеюсь, мое редактирование поможет объяснить мой вопрос еще немного. – Emlyn

ответ

0

Изменение коллекции это:

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

затем добавить в конструкторе

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

Поскольку WPF использует отражение для получения связанных данных из контекста данных он должен быть в состоянии для получения значений производных классов, хранящихся в этой коллекции.

Также при запуске приложения проверьте окно вывода с выбранным отлаживанием, механизм XAML выведет на него любые ошибки привязки.

+0

Я пробовал этот подход, но поскольку GridData объявлен как ObservableCollection () , он по-прежнему не отображает поля производного класса. – Emlyn

0

Ваша модель ViewModel должна содержать список с типом, который будет отображаться вашей сеткой (в данном случае, тип ChatMessage). Вы все равно можете использовать наследование для вызова общих методов, но список с привязкой должен быть типа ChatMessage

+0

А я думал, что это так. Есть ли какая-то возможность иметь некоторую ссылку в базовом классе, так как многие функции, которые я надеялся переместить в этот класс, не ищут специфики класса ChatMessage и этой наблюдаемой коллекции. В противном случае у меня будет много повторяющегося кода для каждой модели просмотра, которая использует другой производный класс из MessageParentBase. – Emlyn

+0

Когда вы получите выбранный элемент, объект, который будет возвращен, будет иметь тип ChatMessage. Поскольку этот класс наследуется от MessageParentBase, у вас будет доступ ко всем его методам в обычном режиме (предположим, что это ваше сомнение) –

+0

Моя реальная проблема заключается в том, как удалить повторяющийся код, который должен ссылаться на наблюдаемую коллекцию GridData (но это только интересуется полями класса MessageParentBase) в базовом классе ViewModel, хотя он все еще способен инициировать наблюдаемую коллекцию как ChatMessage. Я думал, что могу объявить поле в базовой модели viewmodel, а затем объявить свойство в производном ViewModel, но мне говорят, что я не могу преобразовать implicity из одного ObservableCollection в другой, хотя один класс наследуется от другого. – Emlyn

Смежные вопросы