2011-01-04 6 views
2

는 내가 처음으로 실버 라이트 4 응용 프로그램을 개발하고있어 근본적인 UserControl을로 내에서 MainPage.xaml에서 최상위 요소 (그리드)에 설정 내 DataContext를 공유하는 방법에 어려움을 겪고 유형에 UserControl을합니다 형식 안전 방법으로. DataContext 내 ViewModel 클래스의 인스턴스이며 내 생각은 ViewModel 속성 UserControl 특정 요소를 바인딩 할 수 있습니다.공유의 DataContext는 안전한 방법

ViewModel 객체가 내 UserControl에 버블 링되지만 UserControl에서 DataContext가 patternCreatorViewModel 유형인지 어떻게 확인할 수 있습니까?

희망이 이해할 수 있었다!

+0

은 왜 그렇게할까요? 그 질문에 대한 대답을주의 깊게 생각하십시오. – AnthonyWJones

답변

5

이 어디 과정에서 어떤 유형의 안전이 없다는 것을, (내 외로운 생각에), 즉 실버 라이트와 WPF에서 모델을 데이터 바인딩의 가장 큰 한계 중 하나입니다. {Binding ...}을 입력하자마자, 당신은 그물없이 일하고 있습니다. MS는 C#과 같이 멋지고 강력하게 형식화 된 언어를 사용하여 완전히 형식이없는 데이터 바인딩 모델에 묶어 C#에 대한 Anders Hejlsberg의 훌륭한 작업 10 년을 망쳤습니다. 동적 언어로 작업 할 때 이런 종류의 "느슨 함"이 예상되지만 C#을 다룰 때가 아닙니다. 당신이 당신의 뷰를 기본 뷰 모델을 변경할 때

이 제한은 정말 물론, 데이터 바인딩을 테스트 할 수있는 쉬운 방법이 없기 때문에 문제가된다. 일반적으로 테스트 할 수없는 코드가있을 때 컴파일러를 사용하여 코드에 수행 할 작업에 아무런 의미가 없다고 말할 수 있습니다. 그러나 MS가 데이터 바인딩을 타입 안전하지 않게 만들었 기 때문에 변경 사항을 테스트 할 수있을뿐만 아니라 컴파일러를 사용하여 이해가되지 않을 때도 알 수 없습니다. 또한 부상을 입히기 위해 애플리케이션을 실행하고 오류 메시지가 표시되는지 여부를 확인할 수 없습니다. 바인딩은 항상 자동으로 실패하기 때문입니다. 당신이 할 수있는 최선의 방법은 로깅 수준을 높이고 수많은 디버그 오류 메시지를 살펴 보는 것입니다. 우그. 지독한 냄새.

내 블로그 게시 here, 또 다른 질문은 here이며 내 답변은 here입니다. 근본적인 문제에 대한 자세한 내용은 여기를 참조하십시오.

내가, 내가 거의 혼자 일에 대한 내 의견 것 같다 있음을 유의 그래서 아마도 난 그냥 누락 것을 거대한 뭔가가있다. 하지만 개인적으로 네가 머리에 못을 박은 것 같아.

+0

형식 안전 형 API 및 Xaml 구문이 무엇인지 궁금 할 것입니다. – AnthonyWJones

+0

나는 그 생각을 들었지만 분명히 충분하지는 않았다 :-). 내 의혹은 그것이 C# 제네릭과 조금 비슷하게 행동 할 것이라는 것입니다. XAML에서 개체를 선언하면 과 같이 바인딩 할 것으로 예상되는 형식을 지정합니다. 유형 검사를 원하지 않는다면, 그 속성을 공백으로 두지 만, 지정된 경우, 데이터 컨텍스트에 지정된 모든 객체가 해당 유형의 인스턴스인지 확인하고 지정한 모든 데이터 바인딩이 그 유형으로 작업 할 수 있는지 확인하십시오. –

+2

당신은 혼자가 아닙니다 : P 이전 버전의 Entity Framework 포함 경로 - 적어도 최신 버전에서 수정 된 경로 포함. 그래서 언젠가는 WPF에서의 바인딩이 더 좋을 것입니다. (물론 바인딩은 타입 - 세이브입니다. 단지 DataContext의 타입을 정의 할 수없고 커스텀 DependencyProperties로 작업해야합니다) – mattanja

관련 문제