none
Generic ViewModel RRS feed

  • Вопрос

  • Есть базовый абстрактный generic класс ViewModel. Есть две VM, которые наследуются от него и по большому счету только указывают тип дженерика.

    Есть 2 DataTemplate для каждой из VM. Но так уж получилось, что эти два шаблона обращаются только к базовым свойствам (к свойствам, которые определены в абстрактном VM). Как мне сделать только один шаблон?

    P.S. Вложеный в шаблоны один UserControl  делать не хочется, потому что в нем не будет четкой привязки к VM и её свойствам.

    Отвечающий

Ответы

  • Стандартный механизим выбора data template не позволяет указать что-то вроде "все типы, созданные из генерика X<>". Напишите свой DataTemplateSelector.

    Или вынесите совсем базовые свойства в совсем базовый не-генерик тип, и объявите шаблон для него. Судя по описанию, шаблоны у вас никак не завязаны на ту часть базового класса, которая требует типизации type-параметрами.

    • Помечено в качестве ответа Abolmasov Dmitry 27 июля 2012 г. 9:22
    3 июля 2012 г. 12:50
  • К сожалению вынести не получается, зато получилось сделать так (единственный минус - нет проверки правильности написания свойств в байндингах):

    <ControlTemplate x:Key="searchControlTemplate">
        <!--//-->
    </ControlTemplate>
    
    <DataTemplate DataType="{x:Type s:GroupSearchViewModel}">
        <ContentControl Template="{StaticResource searchControlTemplate}" />
    </DataTemplate>
    <DataTemplate DataType="{x:Type s:UserSearchViewModel}">
        <ContentControl Template="{StaticResource searchControlTemplate}" />
    </DataTemplate>


    Отвечающий

Все ответы

  • Добрый день.

    Не очень понятно, в чем у вас проблема. Вы эти разные VM где показываете, что вам понадобился DataTemplate для них, вместо контрола который будет реализовывать View?

    Отвечающий
  • Все шаблоны подключаются как ресурсы. Шаблон может использоваться в нескольких местах. При этом он используется как шаблон для ContentPresenter. Я не хочу внутри использовать свой контрол - эдак можно много их наплодить, когда достаточно шаблона.

    Конечно за мной всегда остаются варианты с юзер контролом и двумя шаблонами, одинаково определенными (копи-паст), но возможно существуют более красивые решения.

    Отвечающий
  • Видимо, я что-то не понимаю. Раз у вас нужно во View показывать свойства только из базового ViewModel, зачем вам два разных DataTemplate или два UserControl. Создайте один (или тот или другой тип) и используйте его везде где вам необходимо?

    Отвечающий
  • Стандартный механизим выбора data template не позволяет указать что-то вроде "все типы, созданные из генерика X<>". Напишите свой DataTemplateSelector.

    Или вынесите совсем базовые свойства в совсем базовый не-генерик тип, и объявите шаблон для него. Судя по описанию, шаблоны у вас никак не завязаны на ту часть базового класса, которая требует типизации type-параметрами.

    • Помечено в качестве ответа Abolmasov Dmitry 27 июля 2012 г. 9:22
    3 июля 2012 г. 12:50
  • К сожалению вынести не получается, зато получилось сделать так (единственный минус - нет проверки правильности написания свойств в байндингах):

    <ControlTemplate x:Key="searchControlTemplate">
        <!--//-->
    </ControlTemplate>
    
    <DataTemplate DataType="{x:Type s:GroupSearchViewModel}">
        <ContentControl Template="{StaticResource searchControlTemplate}" />
    </DataTemplate>
    <DataTemplate DataType="{x:Type s:UserSearchViewModel}">
        <ContentControl Template="{StaticResource searchControlTemplate}" />
    </DataTemplate>


    Отвечающий