2011-09-28 6 views
3

내 리소스 사전의 코드 뒤에 ResourceDictionary DataContext를 설정하려고합니다.코드 뒤에서 ResourceDictionary DataContext 설정

내가 자신의 스타일 (리소스 사전)를 사용하는 데이터 템플릿을 가지고, 스타일이 자신의 스타일 확인란을 포함하십시오 CheckBox_Checked 이벤트에서

<Style x:Key="CheckBoxStyle" TargetType="CheckBox"> 
    <EventSetter Event="CheckBox.Checked" Handler="CheckBox_Checked"/> 
    <EventSetter Event="CheckBox.Unchecked" Handler="CheckBox_Unchecked"/>   
</Style> 

을, 나는 사전의 부모 (참조 할 자원 사전에 제어 이벤트 내부에서의 DataContext를 설정의 DataContext 속성을 가지고 있지 않기 때문에 사용자 정의 컨트롤)보기 모델이 같은 기능을 실행하지만합니다 :

private void CheckBox_Checked(object sender, RoutedEventArgs e) 
    { 
     MyViewModel viewModel = (MyViewModel)DataContext; 
    } 

물론 (작동하지 않습니다).

은 내가 조상 (리소스 사전 사용자 컨트롤)에 대한 핸들을 얻을 필요가 있다고 생각하지만,이 작업을 수행하는 방법을 모른다 - 나 ..

감사

다른 방법이있을 수 있습니다 Joe

+1

왜이 작업을 수행하려고합니까? 몇 가지 샘플 코드 게시, 예? –

+1

이것은별로 의미가 없습니다. 물론 ResourceDictionaries에는 DataContext가 없으며 DataBinding을 사용할 수없는 컨트롤이 아닙니다. ResourceDictionary는 이름에서 알 수 있듯이 Key가 식별 한 자원 사전입니다. 혼란 스러울 수있는 것은 UserControl과 Windows에 XAML 파일이 있고 이러한 XAML을 ResourceDictionaries를 설명하는 XAML과 혼합 할 수 있다는 것입니다. 그러나 그들은 꽤 다릅니다. XAML은 ResourceDictionary를 의미하지 않습니다. – dowhilefor

답변

7

@ dowhilefor의 의견에 따르면 리소스 사전은 단순히 리소스 모음이므로 DataContext는 필요하지 않습니다. 그러나 ResourceDictionary에 코드 숨김 파일을 추가 할 수 있습니다.이 코드는 사용자가 원하는 것일 수 있습니다.

ResourceDictionary과 같은 디렉토리에 새 클래스를 만들고 이름을 ResourceDictionaryName.xaml.cs로 지정하십시오. ResourceDictionary의 코드 숨김 파일이됩니다.

public partial class ResourceDictionaryName 
{ 
    public ResourceDictionaryName() 
    { 
     InitializeComponent(); 
    } 
} 

다음, 당신의 XAML 파일을 열고 다음 x:Class 속성을 추가 :

를 열고 새 .cs 파일 및 확인 다음을가 (자동 여부 추가되는 경우 기억할 수)입니다 ResourceDictionary 태그로 :

<ResourceDictionary x:Class="MyNamespace.ResourceDictionaryName" ... /> 

는 이제 ResourceDictionary 실제로 클래스 및 코드 숨김 파일을 가질 수 있습니다. 편집에 대응

편집

, 나는 데이터의 취득 후 CheckBox의 자체를 사용하여 CheckBox에의 DataContext에 하나를 얻을, 또는 시각적 트리를 통과 내가 찾고 해당 UserControl을 찾을 수 및 것 문맥

쉬운 방법 :

private void CheckBox_Checked(object sender, RoutedEventArgs e) 
{ 
    var cbx = sender as CheckBox; 
    MyViewModel viewModel = (MyViewModel)cbx.DataContext; 
} 

의 CheckBox의 DataContext에 당신이 찾고있는 뷰 모델이 아닌 경우 :

private void CheckBox_Checked(object sender, RoutedEventArgs e) 
{ 
    var cbx = sender as CheckBox; 
    var userControl = FindAncestor<MyUserControl>(cbx); 
    MyViewModel viewModel = (MyViewModel)myUserControl.DataContext; 
} 

public static T FindAncestor<T>(DependencyObject current) 
    where T : DependencyObject 
{ 
    current = VisualTreeHelper.GetParent(current); 

    while (current != null) 
    { 
     if (current is T) 
     { 
      return (T)current; 
     } 
     current = VisualTreeHelper.GetParent(current); 
    }; 
    return null; 
} 
+0

감사합니다 레이첼 - 네가 정확히 뭐하는거야 - 그럼 어떻게 부모 (사용자 정의 컨트롤)의 모델을 참조 할 수 있습니까? (수정 된 질문을 참조하십시오. –

+0

일반적으로 ViewModel을 가져 오기 위해'(CheckBox로 보낸 사람) .DataContext'를 사용합니다. 또는 DataContext가 ViewModel이 아닌 경우 CheckBox 참조 ('sender')를 가져 와서 시각적으로 트래버스합니다 트리 내가 찾을 때까지 'MyUserControl' 형식의 개체를 얻을 그것의 DataContext 얻을 편집 내 대답 – Rachel

+0

고마워, 레이첼 –

관련 문제