2010-06-02 4 views
4

작업 내 UserControl을의 소비자가 해당 UserControl의 DataContext에를 할당하거나 일부 종속성 속성을 설정해야 다음 질문는 WPF의 UserControl을하고 MVVM

  1. 있습니다. (# 3과 관련 : DataContext의 경우 개별 항목이 DC에 지정된 객체에 직접 바인딩되어야 함 (DP와 관련된 모든 VM에 바인딩 할 수 있음)
  2. 속성을 설정하고 사용하는 경우 3 프리미티브 항목, 나는 그들을 개별 속성으로 받아들이거나 내 사용자 정의 컨트롤에 대한 모델에 함께 결합해야합니까
  3. 내 사용자 컨트롤이 나를 모델 또는 뷰 모델을 보내도록 요청해야합니까 (뷰 모델은 말했지만 사용했던 모든 컨트롤 지금까지, 나는 VM 보내달라고 요청하는 사람을 본 적이 없다 - 나는 일부는 내부적으로
+0

사용자 정의 컨트롤의 기능은 무엇입니까? 동작이 VM 내부의 일부 속성에 의존합니까? 일반적으로 소비자는 자신이 적합하다고 생각하는 속성을 자유롭게 설정하거나 바인딩 할 수 있습니다. 사용자 정의 컨트롤의 동작을 조정할 수있는 대부분의 작업은 속성 (DP)으로 제공됩니다. – Gishu

+0

컨트롤은 원시 데이터를 가져 와서 삭제합니다. 또한 연마 된 데이터를 UI에 표시되는 속성으로 노출합니다. VM에 원시 데이터를 연마 된 데이터로 변환하는 논리가 포함되어 있습니다. –

+1

은 UserControl 동작처럼 들리지 않습니다. 하나의 데이터 구조체를 가져와 다른 구조체를 출력하는 처리/변환/변환기 클래스와 비슷합니다. 그런 다음이 새 구조체를 일반 WPF 데이터 바인딩을 통해 UI에 바인딩 할 수 있습니다. – Gishu

답변

0

1. 가 나는 그것이 "GE의 경우이, UserControl을의 종류에 따라 달라집니다 말을 MVVM을 구현 할 수있다 확신 neric "컨트롤 내부적으로 DataContext와 아무 관계가 없어야하므로 DataContext를 변경할 수 있어야합니다. 예를 들어 CaptionImageSource 속성을 노출하는 UserControl을 만들면 내부적으로 DataContext와 독립적으로 바인딩해야합니다. 인스턴스에 바인딩 할 수 있으며 DataContext도 변경할 수 있습니다. 반면에 UserControl을 내가 UserControl을이 뷰 모델에 결합 할 것으로 예상 것 뷰 모델에 대한 뷰가있는 경우

<uc:ImageButton DataContext="{Binding ButtonInfo}" 
       Caption="{Binding Caption}" 
       ImageSource="{Binding Image}"/> 

:

여기
<uc:ImageButton Caption="{Binding ButtonInfo.Caption}" 
       ImageSource="{Binding ButtonInfo.Image}"/> 

한 다음 바인딩을 약간 단순화의 DataContext를 변경할 수 있습니다 DataContext를 기준으로 내부적으로 속성 현재 DataContext를 이미 아무것도하지 않고 간단한 예를이해야 할 해당 뷰의 뷰 모델 인 DataTemplate을 너무

, 즉
<v:StatisticsView /> 

전달 될 뷰 모델이 현재의 DataContext의 속성에있는 경우

당신 뿐만 아니라 DataContext에 바인딩 할 수 있습니다

<v:StatisticsView DataContext="{Binding StatisticsViewModel}"/> 

2. 이 내가 말할 것 중 하나의 방법을 처리 할 수 ​​있습니다, 특히 경우 하 세 가지 속성만으로도 그 속성을 만들 수있는 번거 로움이 없습니다. 의존성과 같은 몇 가지 측면을 고려해 볼 수 있습니다. 세 가지 속성을 하나의 대상으로 묶는 것이 합리적입니까? (1)에 언급 된 바와 같이 그것이 소비자가 (현재의 DataContext 상속 또는 명시 적으로 결합하여 암시 적)을 StatisticsViewModel 전달해야 StatisticsView 만약


3. 이, UserControl을 자체에서 명백하다.

+0

내부적으로 1 datacontext에 이미 연결되어있는 경우 외부 datacontext에 외부 datacontext가 할당되면 첫 번째 (내부 하나) datacontext가 중단되어 기능이 중단되므로 (1)에서 설명한 방식대로 작동하지 않습니다. 왜이 기능이 필요합니까? 글쎄, 내부 뷰 모델에 nunit 테스트를 작성하여 컨트롤이 올바르게 작동하는 것을 알고 싶습니다. –

+0

@NitinChaudhari : (1)에서 언급했듯이 * UserControls는 DataContext와 아무 관계가 없어야합니다. 또한 왜 내부적으로 DataContext를 설정해야합니까? 항상 ViewModel을 DataContext로 상속하거나 외부에서 명시 적으로 설정할 수 있습니다. –

+0

UI에 표시되는 내용이 viewmodel에 의해 처리되므로 내부적으로 설정해야합니다. 즉, nunit 테스트를 작성할 수 있으므로 1을 유지하는 것이 좋습니다. 예 내 컨트롤이 여러 곳에서 일반 사용자 컨트롤로 사용됩니다. –

2

소비자가 사용자 제어를 원합니다. 그래서 사용자 컨 트롤이 모든 컨텍스트/응용 프로그램 (WPF)에서 작동 할 수 있어야합니다. 그래서, 귀하의 질문에 대답

1) 소비자는 사용자 정의 컨트롤에 정의 된 종속성 속성을 설정해야합니다. datacontext를 사용하면 사용자 정의 컨트롤을 소비자에 연결하게됩니다.

2) 개별 프리미티브 속성으로 가져와야합니다. 그렇지 않으면 소비자가 모델을 처리하기 위해 불필요하게 개체를 만들어야합니다 (다시 커플 링 - 소비자가 모델에 대해 알아야하는 이유는 무엇입니까?).

3) 아니요. cosumer에게 뷰 모델을 보내달라고 요청해서는 안됩니다. 왜 어떤 소비자가 "일반"사용자 컨트롤을 사용하는지 파악해야합니다.

실용적인 고려 사항 때문에 위의 작업 중 하나를 수행 할 수없는 경우 - 사용자 컨 트롤이 특정 컨텍스트와 결합되어 있기 때문에 모든 규칙을 위반하는 것에 대해 걱정할 필요가 없습니다. 더 이상 일반 규칙이 아닙니다. 일반 사용자 컨트롤을 작성하면 모든 WPF 응용 프로그램에서 사용자 정의 컨트롤을 사용할 수 있습니다. 너의 부름이다.