2015-01-25 3 views
5

변환 할 때이 데이터가 필요하고이 데이터가 바인딩 대상이 아닌 다른 개체에 있기 때문에 변환기 클래스에서 DependencyProperty를 정의해야합니다.IValueConverter 클래스에서 속성 정의

내 변환 클래스는 다음 다음

public class LEGOMaterialConverter : DependencyObject, IValueConverter 
{ 
    public DependencyProperty MaterialsListProperty = DependencyProperty.Register("MaterialsList", typeof(Dictionary<int, LEGOMaterial>), typeof(LEGOMaterialConverter)); 

    public Dictionary<int, LEGOMaterial> MaterialsList 
    { 
     get 
     { 
      return (Dictionary<int, LEGOMaterial>)GetValue(MaterialsListProperty); 
     } 
     set 
     { 
      SetValue(MaterialsListProperty, value); 
     } 
    } 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     LEGOMaterial material = null; 

     MaterialsList.TryGetValue((int)value, out material); 

     return material; 
    } 

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

나는 Window.REsources 영역을 instanciating 해요 :

<Window.Resources> 
    <local:LEGOMaterialConverter x:Key="MaterialsConverter" MaterialsList="{Binding Path=Materials}" /> 
</Window.Resources> 

나는 다음과 같은 오류 받고 있어요 :

'MaterialsList' property was already registered by 'LEGOMaterialConverter'. 

누구든지이 오류에 대한 단서가 있습니까?

+1

멀티 바인딩 및 MultiValueConverter를 사용해 보셨습니까? http://stackoverflow.com/questions/15309008/binding-converterparameter를 참조하십시오. –

답변

7

은 (단지 예)과 같이 그 일을보십시오 : 나는 태그 확장에서 파생

public class ValueConverterWithProperties : MarkupExtension, IValueConverter 
{ 
    public int TrueValue { get; set; } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     return this; 
    } 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if ((int) value == TrueValue) 
     { 
      return true; 
     } 
     return false; 
    } 

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

통지 나이처럼 사용할 수 있도록 :

<Window x:Class="Converter.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:converter="clr-namespace:Converter" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <CheckBox IsChecked="{Binding item, Converter={converter:ValueConverterWithProperties TrueValue=5}}"></CheckBox> 
    <CheckBox IsChecked="{Binding item2, Converter={converter:ValueConverterWithProperties TrueValue=10}}"></CheckBox> 
</Grid> 

+0

내 문제를 해결하는 것 같지만, 귀하의 경우 데이터를 전달하기 쉽습니다. 정수 값을 XAML에 입력하십시오. 변환기에 사전을 어떻게 전달합니까? – RBasniak

+0

사전에 뭐죠? 그것은 정적입니까? 그것은 역동적입니까? –

+0

내 수업 중 하나의 속성입니다. 한 번로드 된 후 더 이상 변경되지 않습니다. 하지만 폼이로드 된 후에 만 ​​설정됩니다. – RBasniak

3

, BTW 이 오류는 정적이 아닌 변환기의 종속성 속성으로 인해 발생합니다 (이전에이 변환기의 인스턴스를 만든 후).

EDIT 그래서 문제점이 라인이다 : 여기 종속성 속성 MaterialsListProperty

public DependencyProperty MaterialsListProperty = DependencyProperty.Register("MaterialsList", typeof(Dictionary<int, LEGOMaterial>), typeof(LEGOMaterialConverter)); 

이 유형 (즉 LEGOMaterialConverter)의 개체마다 인스턴스화으로 등록되고있다.

public static readonly DependencyProperty MaterialsListProperty = DependencyProperty.Register("MaterialsList", typeof(Dictionary<int, LEGOMaterial>), typeof(LEGOMaterialConverter)); 

정적 변수가 초기화 (및 종속성 속성 등록) 한 번만 유형의 모든 미래 인스턴스 그것은 우리가 필요로하는 것입니다 :

는 그러나 종속성 속성과 같이, 정적 정의되어야한다 이리. 위와 같은 오류가 발생하여 정적 속성으로 종속성 속성을 선언하지 못했습니다.

+0

좀 더 자세한 답변을 제공해주십시오. – martianwars

+1

명확하게 대답을 편집했습니다. 충분히 길기를 바란다. –