2009-05-14 5 views
0

컬렉션에 ItemSource가 설정된 스택 패널이있는 UserControl (a)이 있습니다. StackPanel에는 몇 개의 단추와 DataGrid 컨트롤이 포함 된 UserControl (b) 집합이 들어 있습니다. UserControl (b)의 코드 뒤에서 부모 UserControl (a) 코드의 속성에 액세스하는 방법이 있습니까?포함 된 컨트롤에서 WPF 액세스 정보

기본적으로 UserControl (a)이 창에로드 될 때 양식을 읽기 전용으로 간주할지 여부를 나타내는 매개 변수가 전달됩니다. UserControl (b)의 단추 가시성을 부모 UserControl (a)의 codebehind의 readonly 속성에 바인딩하고 싶습니다.

답변

2

일반적으로 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에서 그렇게하지는 마십시오. 마크 업 확장이 공백을 허용하는지 확인하려고 시도하지 않습니다.).

관련 문제