ObjectDataProvider 可以使用派生的 类 吗?

Can an ObjectDataProvider work with derived classes?

假设我有一个用于实现一些基本属性的特定控件的基本视图模型,例如

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,这是毫无意义的,因为它是一个抽象 class 并且不影响实现的 classes。是否可以使用这样的 ODP,或者是否有另一种可能绑定到派生的 classes?

问题是您使用的是基数 class,它不能像您预期的那样工作。由于您在设计时不知道类型,因此您确实遇到了问题。

所以让我们谈谈解决方案。事实上,您不必介意类型,您也可以绑定到特定类型的方法。这很好,因为您现在可以创建一个工厂 class,它会选择正确的类型并 return 一个实例。

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

您还可以创建一个包装器对象,在其中将您的类型传递给参数,并让一个方法 return 成为它的一个实例。

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