引用XAML中的嵌套属性



此问题可能与在XAML中创建嵌套类的实例重复。这个问题和相关的MSDN文档都与嵌套类型有关。在本例中,类型本身没有嵌套,但语法似乎很熟悉。我不知道这是否证明了一个单独的问题和答案的合理性

我想使用ObjectDataProvider访问嵌套属性。我可以访问类型的静态属性,但通过类型的静态特性访问实例属性会导致编译错误。

例如,以以下三个类为例。

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";
   }
}

可以使用以下XAML为A上的BProperty创建ObjectDataProvider

<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的字符串参数"。

如果我将providerObjectInstance设置为"{x:Static Member=local:A.BProperty.CProperty}""{x:Static Member=local:A.BProperty+CProperty}",我会收到编译错误。

如何从ObjectDataProvider访问ABProperty实例上的CProperty

你能做的最好的事情是:

<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

分两步完成:

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

providerOfC让您到达A.BProperty.CProperty

CCD_ 15然后在该实例上调用CCD_ 16。

相关内容

  • 没有找到相关文章

最新更新