2012-07-19 74 views
1

此問題可能與Creating an instance of a nested class in XAML重複。此問題和相關的MSDN文檔涉及嵌套類型。在這個例子中,類型本身並不是嵌套的,但是語法似乎很熟悉。我是否不知道是否有理由提出單獨的問題和答案。引用XAML中的嵌套屬性

我想使用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"; 
    } 
} 

創造BPropertyObjectDataProviderA可以使用以下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的字符串參數」的標籤。

如果我將providerObjectInstance設置爲"{x:Static Member=local:A.BProperty.CProperty}""{x:Static Member=local:A.BProperty+CProperty}"我收到編譯錯誤。

我如何從ObjectDataProvider訪問的BProperty實例?

+0

您的課程和屬性名稱相同。爲了測試,你可以重命名你的類,看看它是否仍然存在? – Xcalibur37 2012-07-19 22:00:44

+0

這個例子是從我原來的代碼簡化的,它的屬性名稱與它們的返回類型不同。在這種情況下,問題仍然存在。但是,這可能會提高此示例的可讀性,因此我將更新代碼。 – bozalina 2012-07-19 22:07:25

+0

我會說這是因爲B被實例化爲靜態。因此,一旦它被實例化,它的上下文屬性就被忽略了。 – Xcalibur37 2012-07-19 22:23:41

回答

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

+0

這也是我到達的解決方案。我希望能有辦法直接做到這一點。由於DataObjectProvider的性質,您提到遠離靜態。你能澄清這個原因嗎? – bozalina 2012-07-20 00:39:08

+0

好吧,爲了公平,我有點主觀。這是因爲我在大多數實現中看到了基於實例的用法。對於你正在做的事情,我個人只會使用MVVM,因爲它在ViewModel的初始設置開銷後給我提供了最大的靈活性。 – Xcalibur37 2012-07-20 00:42:36

1

做,在2個步驟:

<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

provider然後調用GetValue("string argument")實例。