1

この質問は、 Creating an instance of a nested class in XAML と重複している可能性があります。この質問と関連する MSDN ドキュメントは、ネストされた型に関係しています。この例では、型自体はネストされていませんが、構文はおなじみのようです。それが別の質問と回答を正当化するかどうかは、私にはわかりません。

を使用してネストされたプロパティにアクセスしたいと思いますObjectDataProvider。型の静的プロパティにアクセスできますが、型の静的プロパティを介してインスタンス プロパティにアクセスすると、コンパイル エラーが発生します。

たとえば、次の 3 つのクラスを取り上げます。

public static class A
{
   static A()
   {
      BProperty = new B();
   }

   public static B BProperty { get; private set; }
}

public class B
{
   public B()
   {
      CProperty = new C();
   }

   public C CProperty { get; private set; }

   public string GetValue(string arg)
   {
      return arg + " from B";
   }
}

public class C
{
   public string GetValue(string arg)
   {
      return arg + " from C";
   }
}

ObjectDataProviderfor BPropertyonの作成はA、次の XAML を使用して実行できます。

<Window.Resources>
   <ObjectDataProvider x:Key="provider"
                       ObjectInstance="{x:Static Member=local:A.BProperty}"
                       MethodName="GetValue">
      <ObjectDataProvider.MethodParameters>
         <System:String>string argument</System:String>
      </ObjectDataProvider.MethodParameters>
   </ObjectDataProvider>
</Window.Resources>
<Grid>
   <Label Content="{Binding Source={StaticResource provider}}" />
</Grid>

このコードを実行すると、「B からの文字列引数」というテキストのラベルが生成されます。

を に設定providerするObjectInstanceと、"{x:Static Member=local:A.BProperty.CProperty}"または"{x:Static Member=local:A.BProperty+CProperty}"コンパイル エラーが発生します。

からの のインスタンスにアクセスCPropertyするにはどうすればよいですか?ABPropertyObjectDataProvider

4

2 に答える 2

1

あなたができる最善のことはこれです:

<Window.Resources>
    <ObjectDataProvider x:Key="provider"
                   ObjectType="{x:Type local:A}"
                   MethodName="GetCValue">
        <ObjectDataProvider.MethodParameters>
            <System:String>string argument</System:String>
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
</Window.Resources>


public class A
{
    public A()
    {
        BProperty = new B();
    }

    public B BProperty { get; private set; }

    public string GetCValue(string arg)
    {
        return BProperty.CProperty.GetValue(arg);
    }
}

public class B
{
    public B()
    {
        CProperty = new C();
    }

    public C CProperty { get; private set; }

    public string GetValue(string arg)
    {
        return arg + " from B";
    }
}

public class C
{
    public string GetValue(string arg)
    {
        return arg + " from C";
    }
}

ObjectDataProviderの性質を考えると、このタイプの実装では静的から離れます

階層化されたオブジェクトを使用する場合は、MVVM パターンを実装し、代わりにすべてのオブジェクトを ViewModel に実装することを検討してください。

ObjectDataProvider の詳細については、次の記事を参照してください: http://msdn.microsoft.com/en-us/magazine/cc163299.aspx

于 2012-07-19T22:41:08.520 に答える