2012-07-19 3 views
1

이 질문은 Creating an instance of a nested class in XAML과 중복 될 수 있습니다. 이 질문 및 관련 MSDN 설명서는 중첩 형식과 관련이 있습니다. 이 예제에서 유형 자체는 중첩되지 않지만 구문은 익숙해 보입니다. 그것이 별도의 질문과 답변을 정당화하는지 여부는 알지 못합니다.XAML에서 중첩 된 속성 참조

가 나는 ObjectDataProvider를 사용하여 중첩 된 속성에 액세스하고 싶습니다. 유형의 정적 속성에 액세스 할 수 있지만 유형의 정적 속성을 통해 인스턴스 속성에 액세스하면 컴파일 오류가 발생합니다.

예를 들어, 다음 세 가지 클래스를 선택하십시오. ABProperty에 대한 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을 사용하여 수행 할 수 있습니다.

<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에서 A 님의 인스턴스 BProperty에 어떻게 액세스 할 수 있습니까?

+0

클래스 및 속성 이름은 동일합니다. 테스트를 위해 클래스의 이름을 바꾸고 클래스가 계속 발생하는지 확인할 수 있습니까? – Xcalibur37

+0

이 예제는 반환 형식과 다른 이름의 속성을 가진 원래 코드에서 단순화되었습니다. 이 경우에도 문제가 계속 발생합니다. 그러나이 예제에서는 가독성이 향상되므로 코드를 업데이트 할 예정입니다. – bozalina

+0

B는 정적으로 인스턴스화 되었기 때문에 이것이라고합니다. 따라서 일단 인스턴스화되면 문맥 적 속성은 무시됩니다. – Xcalibur37

답변

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

+0

글쎄, 공정하기 위해서 나는 조금 주관적이다. 대부분의 구현에서 본 인스턴스 기반 사용 때문입니다.당신이하고있는 일을 위해 MVVM을 개인적으로 사용하는 것은 ViewModel의 초기 셋업 오버 헤드 이후에 가장 융통성이 있기 때문입니다. – Xcalibur37

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

provider가 그에 GetValue("string argument")를 호출까지 A.BProperty.CProperty 등을 얻는다 예.