Поддержка общего редактирования модели представления - PullRequest
2 голосов
/ 20 января 2010

У меня есть абстрактная универсальная модель представления, которую я использую в качестве базового класса для нескольких других моделей представления. Он определяется следующим образом:

public abstract class DiscreteViewModel<T>
{
    protected DiscreteItem<T> _selectedItem;
    ...
}

Мой DiscreteItem класс также является общим и выглядит следующим образом:

public class DiscreteItem<T>
{
    public T Display { get; set; }
    public double Value { get; set; }
}

Моя идея состояла в том, чтобы изменить значения через базовый интерфейс Value (поскольку все значения моих элементов являются двойными), но затем отобразить различные типы вещей (цвета, строки, изображения), используя свойство Display.

Проблема возникает, когда я пытаюсь создать редактирование Window для редактирования этих моделей представления. Моя цель состояла в том, чтобы иметь один Window, определенный в XAML, и использовать шаблоны данных и, возможно, DataTemplateSelector, чтобы обеспечить различные типы редактирования для типов DiscreteItem. Например, если я вижу цвет, я хочу подключить поле со списком палитры цветов для его редактирования. И если я вижу строку, я хочу подключить простое текстовое поле и т. Д. Я быстро обнаружил, что поддержка обобщений в XAML по существу отсутствует. Я даже не могу создать экземпляр редактирования Window в XAML.

Очевидно, я не хочу писать редактор Window класс для каждого возможного типа DiscreteItem. Это приведет к большому количеству дублированного кода и дальнейшему дублированию, когда кто-то другой придет и захочет отредактировать какой-то новый тип. Мне нужен один редактор, который можно использовать для всех типов DiscreteViewModel. У кого-нибудь есть изящное представление о том, как это сделать? Являются ли дженерики даже правильным способом?

Ответы [ 2 ]

0 голосов
/ 20 января 2010

Я бы не стал использовать здесь дженерики, и я бы сделал Display типа объекта. тогда вы можете иметь общее окно, которое устанавливает его содержимое как дискретный элемент, и позволяет шаблонам данных делать все остальное.

0 голосов
/ 20 января 2010

DataTemplate являются предпочтительным решением этой проблемы. Вы можете поместить шаблоны в ResourceDictionary и использовать их во всем приложении.

Обновление за комментарий

Обычно для этого вы не будете использовать Generics, вместо этого вы будете комбинировать DataTemplate и DataContext, которые будут содержать элемент для редактирования.

<!-- Gross simplification -->
<Window x:Name="EditorWindow">
    <ContentControl Content="{Binding}"/>
</Window>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...