Как повторно использовать определение DataTemplate для двух классов, которые имеют отношения наследования между ними? - PullRequest
0 голосов
/ 18 марта 2020

У меня есть две виртуальные машины, одна из которых наследуется от другой

public class BasicVM
{

  public SectionTitle SectionTitle{get;set;}
   //snip the common properties...
}

public class InheritedVM:BasicVM
{
   //additional properties and methods
}

В пользовательском интерфейсе:

public interface ILayoutUpdater
{
}

public class DefaultLayoutUpdater:ILayoutUpdater 
{
}

public class InheritLayoutUpdater:ILayoutUpdater 
{
}

Элемент управления представлением также имеет свойство зависимости типа ILayoutUpdater, ie:

public class OutputView
{
    public ILayoutUpdater LayoutUpdater
        {
            get { return (ILayoutUpdater)GetValue(LayoutUpdaterProperty); }
            set { SetValue(LayoutUpdaterProperty, value); }
        }

        public static readonly DependencyProperty LayoutUpdaterProperty
            = DependencyProperty.Register(nameof(LayoutUpdater), typeof(ILayoutUpdater), typeof(OutputView)
                , new PropertyMetadata(null, new PropertyChangedCallback(OnLayoutUpdaterChanged)));

 public SectionTitle SectionTitle
        {
            get { return (SectionTitle)GetValue(SectionTitleProperty); }
            set { SetValue(SectionTitleProperty, value); }
        }

        public static readonly DependencyProperty SectionTitleProperty
            = DependencyProperty.Register(nameof(SectionTitle), typeof(SectionTitle),
                typeof(OutputView), new PropertyMetadata(SectionTitle.Normal, new PropertyChangedCallback(OnSectionTitleChanged)));
}

Важным моментом является то, что для BasicVM View LayoutUpdater ему должен быть присвоен DefaultLayoutUpdater объект, тогда как для InheritVM view LayoutUpdater ему должен быть присвоен InheritLayoutUpdater .

Теперь я выполняю работу в XAML, определяя два DataTemplate DataType, как показано ниже.

 <DataTemplate DataType="{x:Type vms:BasicVM}">
        <views:OutputView 
            SectionTitle="{Binding SectionTitle}"  
            <!-- snipped 10++ properties -->         
            <views:OutputView.LayoutUpdater>
                <views:DefaultLayoutUpdater />
            </views:OutputView.LayoutUpdater>
    </DataTemplate>

 <DataTemplate DataType="{x:Type vms:InheritedVM}">
        <views:OutputView 
            SectionTitle="{Binding SectionTitle}"  
            <!-- snipped 10++ properties -->         
            <views:OutputView.LayoutUpdater>
                <views:InheritLayoutUpdater />
            </views:OutputView.LayoutUpdater>
    </DataTemplate>

Это выполняет работу, но есть много дублирования, особенно эти свойства которые распространены в обоих классах. Как видите, все одинаково, кроме присвоения LayoutUpdater.

Как сделать приведенный выше код так, чтобы дублирование было минимизировано?

1 Ответ

2 голосов
/ 18 марта 2020

создать общий стиль для OutputView и назначить его в каждом шаблоне

<Style x:Key="CommonOutputView" TargetType="{x:Type views:OutputView}">
     <Setter Property="CommonProperty" Value="CommonValue"/>
</Style>

<DataTemplate DataType="{x:Type vms:BasicVM}">
    <views:OutputView 
        SectionTitle="{Binding SectionTitle}" 
        Style="{StaticResource CommonOutputView}"/>
        <views:OutputView.LayoutUpdater>
            <views:DefaultLayoutUpdater />
        </views:OutputView.LayoutUpdater>
</DataTemplate>

<DataTemplate DataType="{x:Type vms:InheritedVM}">
    <views:OutputView 
        SectionTitle="{Binding SectionTitle}" 
        Style="{StaticResource CommonOutputView}"/>        
        <views:OutputView.LayoutUpdater>
            <views:InheritLayoutUpdater />
        </views:OutputView.LayoutUpdater>
</DataTemplate>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...