2012-04-25 4 views
0

나는 자신의 컨트럭터를 통해 할당 된 WPF 애플리케이션에 연결된 MainViewModel이있는 MainView를 가지고있다.중첩 된 뷰에 개별 뷰 모델 할당?

앱> URI를 시작 > MainWindow.xaml

public MainWindow() 
    { 
     InitializeComponent(); 

     var viewModel = new MainViewModel(); 

     DataContext = viewModel; 
    } 
내 MAINVIEW는 최대 네 중첩 된 뷰 또는 숨겨지고 있었다 버튼에 따라 표시되는 아이 뷰를 보유하고

MainView를 클릭하십시오. 그래서 우리는 MainView의 각 버튼에 할당 된 명령 바인딩을 통해 업데이트되는 바인딩에 대한 가시성 속성을 토글합니다.

각 중첩 된 뷰에는 연결된 ViewModel이 없으며 하위 뷰에있는 모든 바인딩은 MainViewModel에서 해당 정보를 찾습니다. 그래서 바인딩 시스템은 부모 'MainView'가 연결된 ViewModel을 가지고 있는지 확인하기 위해 앱의 UI 트리를 마무리합니다.

전체적으로 'ONE'-> ViewModel입니다. 이것은 잘 작동하는 것으로 보이지만 예상대로이 VM은 커지고 리팩토링이 필요합니다. 문맥 상으로해서는 안되는 정보를 보유하고 있습니다. 그러나 이것은 증명 개념 응용 프로그램입니다. 그래서 나는 그것을 간단하게 유지하고 그것이 할 수 있는지 확인하기로 결정했습니다.

문제 : 내가 출력 창에 예상 이상 깨진 행동으로 바인딩 오류를 발견 빈 뷰 모델로 빈보기를 할당 시도

. 어느 말이 합당하지 않습니다 ... WPF가 중첩 된 뷰 컨트롤에서 찾은 모든 바인딩을 처리하는 방법을 알 수있는보다 명확하고 간결한 방법이 있습니까? 각 뷰의 생성자가 위에 표시된 것과 같이 해당 VM을 할당했다면 논리적으로 합리적으로 작동해야한다고 생각했습니다. 불행하게도 MainView의 모든 버튼은 해당 뷰가 켜져 있고 다른 뷰를 숨기도록 지정된 ViewModel이있을 때 작동을 멈 춥니 다. 일부 버튼에서는 작동하지만 다른 버튼에서는 작동하지 않습니다. 이건 정말 이상하니?

답변

0

위의 대답에서 언급했듯이 WPF 바인딩 시스템은 런타임에 바인딩을 해결하기 위해 고심하고있었습니다. 메인 뷰는 인스턴스 생성되고 메인 뷰 컨스트럭터를 통해 할당 된 관련 뷰 모델을 가지며이 패턴은 MainView에도 포함 된 모든 중첩 뷰에 대해 반복됩니다.

기본적으로 나는 암시 적 바인딩 구문을 사용하는 경향이 있습니다. 즉, 원본을 명시 적으로 지정하지 않으면 바인딩 시스템이 바인딩에서 제공 한 이름을 확인하려고 시도합니다. 그래서 모두 암시 적이며 아무 것도 명시 적으로 설정되어 있지 않습니다!

각각의 중첩 된 뷰를 업그레이드하여 자체 뷰 모델을 만들면 바인딩 자동 검색/해결이 조금 복잡해지며 바인딩 시스템에 내가 찾고있는 속성을 찾을 위치를 명시 적으로 말하지 않았습니다. 출력 창 바인딩 오류 .

결과 창에서 중첩 된 뷰 -> viewmodels에서 바인딩 표현식을 해결하려고 시도하는 중일 때 예기치 않은 동작이 발생합니다. 실제로 VM을보고있을 때 비 었음을 알 수 있습니다.

명시 적으로 바인딩 구문 내에서 소스 속성을 명시 적으로 설정하지 않으면 바인딩 시스템이 좋습니다. 그것은 스스로 발견 할만큼 충분히 똑똑합니다. 제 경우에는 물건을 어디서 찾을 지 확신 할 수 없기 때문에 도움이 필요했습니다.

해결책 :

  1. 이 MAINVIEW 생성자에 MainViewModel의 생성자 선언을 제거합니다. ViewModels에 대한 XMLNS에서
  2. 범위는
  3. 자원에게 키를주고 .xaml MAINVIEW 내부의 윈도우 자원을 작성하여 MainView.xaml
  4. 에 namesapce.
  5. 원본 속성을 포함하도록 MainView xaml 파일의 모든 바인딩을 업그레이드하십시오.
  6. 4 단계에서 설정 한 ViewModel 키 값을 가리키는 정적 리소스 바인딩을 제공하십시오.
  7. MainView와 연결된 ViewModel을 참조하는 바인딩에만 6 단계를 수행하십시오.
  8. 중첩 된 모든보기는 그대로 두어야하며 자체 xaml 파일에서 자체 바인딩을 처리해야합니다. MainView는 인스턴스를 생성하고 UI에 배치합니다. 나에게 이것은 사실이었다. 내 중첩 된 견해에 대해 더 이상 구속력이 없다. MainView.xaml 파일에 있던 모든 바인딩은 MainViewModel.cs의 데이터를 참조했습니다. 이것은 문제를 볼 때 훨씬 쉽게 만듭니다.

편집자가 어색하기 때문에 어떤 샘플 코드도 생략했지만 위의 단계는 필자가 수행 한 단계를 수행하기에 충분합니다. 위가 나를 위해 일한 것입니다.

  • 대부분의 책은 짧은 바인딩 구문 하나 이상의 데이터 컨텍스트를 사용할 때 발생하는
  • 에게 가르치는이 문제를 합산하는 또 다른 방법?
  • 바인딩 시스템은 단 손 바인딩 표현을 해결하는 방법을 알고 있어야합니다.