此问题可能与在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的字符串参数"。
如果我将provider
的ObjectInstance
设置为"{x:Static Member=local:A.BProperty.CProperty}"
或"{x:Static Member=local:A.BProperty+CProperty}"
,我会收到编译错误。
如何从ObjectDataProvider
访问A
的BProperty
实例上的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。