У меня есть две виртуальные машины, одна из которых наследуется от другой
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
.
Как сделать приведенный выше код так, чтобы дублирование было минимизировано?