gpt4 book ai didi

c# - ObjectDataProvider 可以与派生类一起使用吗?

转载 作者:太空宇宙 更新时间:2023-11-03 13:09:21 25 4
gpt4 key购买 nike

假设我有一个特定控件的基本 View 模型,该控件实现了一些基本属性,例如

public abstract class ControlVmBase{

public abstract int IconSize {get;set;}

}

我还有一个要与该控件一起使用的 ResourceDictionary,理想情况下将包含的样式中的值绑定(bind)到 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,或者是否有另一种可能绑定(bind)到派生类?

最佳答案

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

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

<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>

关于c# - ObjectDataProvider 可以与派生类一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29674311/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com