2013-07-01 5 views
3

Window의 일부 컨트롤에 대한 변환기를 정의하려고합니다. 나 (그리고 대부분의 사람들)가 보통하는 방식은 변환기 을 자체 클래스에 정의하고 해당 클래스의 인스턴스를 Window.Resources에 인스턴스화 한 다음 사용하는 것입니다. 이 특정한 경우에 문제는 컨버터는 윈도우의 DataContext에 액세스 할 필요가 있다는 것입니다, 그래서 뒤에 윈도우의 코드에서 구현하기로 결정 :Window 코드 뒤에 IValueConverter 구현

public partial class MyWindow : Window, IValueConverter 
{ 
    public MyWindow() 
    { 
     InitializeComponent(); 

     // Other operations 
    } 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     // Access the DataContext and return a value 
     return new object(); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

문제는 내가 그것을 사용하는 방법을 알아낼 수 없습니다 이제 XAML. 분명히 데이터 컨텍스트를 잃을 것이므로이 클래스의 새 인스턴스를 인스턴스화하고 싶지 않습니다. 나는 myWindow이 윈도우의 이름입니다

"{Binding ElementName=someElement, Path=SomeProperty, Converter={Binding ElementName=myWindow}"

을 시도했다. 런타임 오류가 발생합니다.

"A 'Binding' cannot be set on the 'Converter' property of type 'Binding'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject." 

이 방법이 있습니까? 어떤 도움을 주셔서 감사합니다.

+0

여기서 완전히 명확하지 않습니다 - "Window의 DataContext에 액세스해야합니까?"라는 것은 무엇을 의미합니까? "DataContext.SomeProperty"를 변환해야한다는 의미입니까? –

+0

아니요. Convert 및 ConvertBack 메소드에서 윈도우의 DataContext에 액세스해야합니다. – PoweredByOrange

+0

ValueConverter를 리소스로 선언하면 개체에 대한 속성을 설정할 수 있습니다. ValueConverter에 DataContext 속성을 만들어 설정할 수 있습니다. ValueConverter를 DependencyObject에서 상속 받아야 할 수도 있습니다.이 작업을 수행하려면 속성이 DependencyProperty 여야합니다. – cadrell0

답변

3

이 특정한 경우에 문제는 컨버터는 윈도우의 DataContext에 액세스 할 필요가 있다는 것입니다, 그래서 그것을 자신 년대 IValueConverter을하는 것입니다

하나의 옵션 뒤에 윈도우의 코드에서 구현하기로 결정 클래스를 만들고 XAML에서 일반적으로하는 것처럼 인스턴스를 만듭니다. 변환기를 DependencyObject으로 만들 경우 UIElement에 대한 종속성 속성을 추가하고 속성에 창 (myWindow)을 바인딩 할 수 있습니다. 이렇게하면 DataContext를 가져 오기 위해 변환기가 Window에 액세스 할 수 있습니다 (속성을 통해).

컨버터는이 디자인에서 바인딩 내에서 정상적으로 참조 될 수 있습니다.

+0

XAML에서 속성에 액세스하려면 어떻게해야합니까? 나는 여전히 구속력을 사용할 수 없다. 'Converter = {Binding ElementName = myWindow, Path = MyConverter}'실패합니다. – PoweredByOrange

+0

@PoweredByOrange 다른 대안을 제공하기 위해 내가 편집 한 내용을 오해했습니다. –