2

たとえば、いくつかの基本的なプロパティを実装する特定のコントロールの基本ビューモデルがあるとします。

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 を使用することは可能ですか、または派生クラスにバインドする別の可能性はありますか?

4

1 に答える 1

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>
于 2015-04-19T14:54:48.590 に答える