일반적으로 WPF에서는 Model-View-ViewModel 패턴을 구현하는 것이 좋습니다 (MSDN 참조).
이 패턴을 사용하면 바인딩하려는 모든 데이터가 포함 된 ViewModel을 만들 수 있습니다. 이것은 (a) usercontrol에 대한 데이터 컨텍스트로 설정됩니다. 이 컨트롤은 모든 컨트롤을 데이터 인터페이스의 속성에 바인딩합니다.
자식 (b) usercontrol은이 datacontext를 상속하므로 컨트롤을 (a) 사용과 동일한 속성으로 바인딩 할 수 있습니다. 이것은 데이터 인터페이스가 재정의 된 시점까지 논리적 (및 시각적) 트리로 상속되기 때문입니다.
그래서 저는 ReadOnly 속성이 포함 된 ViewModel을 만들려고합니다. 그런 다음이 ViewModel 객체를 (a) usercontrol의 datacontext로 설정할 수 있습니다. (b) usercontrol은 (a) usercontrol 계층 아래에 있기 때문에 동일한 datacontext를 상속합니다. 그러면 아래 (b)의 컨트롤을 아래 표시된 것처럼 (a)와 같은 속성에 바인딩 할 수 있습니다.
<Button IsEnabled="{Binding ReadOnly}"
Context="Click me!"
Command="{Binding ClickMeCommand}" />
뷰 코드 숨김에 datacontext를 설정하려면 다음과 같은 생성자를 사용하십시오.
public MyView(IMyViewModel viewModel)
{
InitializeComponent();
DataContext = viewModel;
}
MyView는 인스턴스에서 UserControl에서 상속하는 클래스입니다. 내가 가지고있는 방식으로 뷰 모델을 가질 필요는 없습니다. 유니티를 사용하여 프리즘을 사용하고 있기 때문에 viewmodel을 뷰에 삽입 할 수 있습니다.하지만 표준 오브젝트로 생성하고 할당 할 수는 있습니다. datacontext에.
나는 또한 일반적으로 ViewModel을 통해 노출하는 datacontext를 사용하여 단추에 명령을 바인딩했습니다. 위임자에게 ICommand 및 프록시를 구현하는 래퍼 클래스를 만들면이 작업이 쉽습니다. 관심이 있으시면 DelegateCommand blog article을 보거나 에있는 DelegateCommand 클래스를보십시오.
보기의 세부 정보 섹션의 데이터 영역을 목록에서 현재 선택된 항목으로 변경하는 마스터/세부 정보보기를 사용할 때 발생할 수있는 datacontext를 어떤 이유로 든 무시한 경우 상대 소스 바인딩을 사용하여 부모 datacontext에 액세스합니다.
예.
<ComboBox Grid.Row="1" Grid.Column="1" x:Name="Unit" IsReadOnly="True"
ItemsSource="{Binding Path=DataContext.AvailableUnits, RelativeSource=
{RelativeSource Mode=FindAncestor,
AncestorType={x:Type Window}}}"
DisplayMemberPath="Name" SelectedItem="{Binding Unit}" />
참고 ItemsSource 바인딩은 부모 소스 창을 찾고 해당 속성의 datacontext에 바인딩하기 위해 상대 소스를 사용합니다. 또한 ItemsSource 바인딩을 따옴표 안에 여러 줄에 걸쳐 명확하게하기 위해 분할했습니다. 그러나 xaml에서 그렇게하지는 마십시오. 마크 업 확장이 공백을 허용하는지 확인하려고 시도하지 않습니다.).