假设我有一个用于实现某些基本属性的特定控件的基本视图模型,例如:
public abstract class ControlVmBase{
public abstract int IconSize {get;set;}
}
我还有一个我希望与该控件一起使用的ResourceDictionary,并且理想地将包含的样式中的值绑定到ControlVmBase
的实现。我认为通过ObjectDataProvider这样做是个好主意,因为它看起来像一个干净的解决方案并在XAML中给我Intellisense支持:
<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,还是有另一种可能性来绑定派生类?
答案 0 :(得分: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>