【问题标题】:Can an ObjectDataProvider work with derived classes?ObjectDataProvider 可以与派生类一起使用吗?
【发布时间】:2015-04-16 12:09:44
【问题描述】:

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

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,或者是否有其他可能绑定到派生类?

【问题讨论】:

    标签: c# wpf resourcedictionary objectdataprovider


    【解决方案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>
    

    【讨论】:

    • 工厂的idea很不错,我明天去试试!
    • 完美运行,与我正在使用的插件机制完美融合,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    相关资源
    最近更新 更多