2015-04-16 6 views
2

Предположим, у меня есть базовая модель просмотра для определенного элемента управления, который реализует некоторые базовые свойства, например.Может ли ObjectDataProvider работать с производными классами?

public abstract class ControlVmBase{ 

    public abstract int IconSize {get;set;} 

} 

У меня также есть ResourceDictionary, которые я хочу использовать с этим элементом управления, и идеально связываемые значения в содержавшихся стилей к реализации ControlVmBase. Я думал, что это будет хорошая идея, чтобы сделать это через ObjectDataProvider, так как она выглядит как чистое решение и дает мне Intellisense поддержку в XAML:

<ResourceDictionary> 
<ObjectDataProvider x:Key="LinkedVm" ObjectType="{x:Type ControlVmBase}" /> 

<Style x:Key="MySpecialControlStyle" TargetType="MyCustomControl"> 
    <Setter Property="ImageSize" Value="{Binding Source={StaticResource LinkedVm}, Path=IconSize}" />  
    </Style> 

</ResourceDictionary> 

Однако это не работает, так как ODP пытается экземпляр ObjectType, который бессмыслен, поскольку он является абстрактным классом и не влияет на реализованные классы. Можно ли использовать такой ODP, или есть ли другая возможность связываться с производными классами?

ответ

1

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

Так что давайте поговорим о решениях. На самом деле вам не нужно думать о типе, вы также можете привязываться к методу определенного типа. Это хорошо, поскольку теперь вы можете создать фабричный класс, который выбирает правильный тип и возвращает экземпляр.

<ObjectDataProvider x:Key="odp" 
        ObjectType="{x:Type local:ControlVmBaseFactory}" 
        MethodName="GetInstance" 
/> 

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

<ObjectDataProvider x:Key="odp" 
        ObjectType="{x:Type local:ControlWrapper}" 
        MethodName="GetInstance" 
> 
    <ObjectDataProvider.ConstructorParameters> 
    <system:Type>Your.Class.Name</system:Type> 
    </ObjectDataProvider.ConstructorParameters> 
</ObjectDataProvider> 
+1

Идея фабрики очень хорошая, я собираюсь попробовать ее завтра! – Lennart

+1

Прекрасно работает и отлично сочетается с механизмом плагина, который я использую, спасибо! – Lennart

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

  • Нет связанных вопросов^_^