2015-01-25 24 views
5

Dönüştürücü sınıfında bir DependencyProperty tanımlamam gerekir çünkü bu verileri dönüştürmek için bu veriye ihtiyacım var ve bu veri başka bir nesnede, bağlandığım nesne değil.Bir IValueConverter sınıfında Özellik Tanımlama

Benim dönüştürücü sınıftır aşağıdadır: Sonra

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(); 
    } 
} 

Ben Window.REsources alan üzerine instanciating ediyorum:

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

aşağıdaki hatayı alıyorum:

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

Bu hata hakkında bir ipucu olan var mı?

+1

Çoklu ciltleme ve MultiValueConverter kullanmayı denediniz mi? Http://stackoverflow.com/questions/15309008/binding-converterparameter adresine bakın. –

cevap

7

(sadece bir örnektir) böyle yapıyor deneyin: Ben biçimlendirme uzantısı kaynaklanıyor

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(); 
    } 
} 

haber bana bu gibi kullanmasına izin vermek için:

<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

Sorunumu çözmekteyim, fakat sizin durumunuzda, verileri iletmek kolay, XAML'de tamsayı değerini yazarsınız. Çeviriciye nasıl bir sözlük gönderirim? – RBasniak

+0

Sözlükteki nedir? Statik mi? dinamik mi –

+0

Derslerimden birinin bir özelliği, bir kez yüklendi ve bundan sonra artık hiç değişmeyecek. Ancak, sadece form yüklendikten sonra ayarlanmış ... – RBasniak

3

Btw, Bu hata, dönüştürücüdeki bağımlılık özelliğinizin statik olmamasına (ve bu dönüştürücünün bir örneğini oluşturduktan sonra) kaynaklanır.

DÜZENLEME Yani sorun bu hat ile geçerli: Burada Bağımlılık Mülkiyet MaterialsListProperty

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

bu tip (yani LEGOMaterialConverter) bir nesnenin her örnekleme ile kaydediliyor.

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

Statik değişken başlatılır (ve Bağımlılık Mülkiyet kayıtlı) sadece bir kez bu türden sonraki tüm örnekler için ve biz gerekenler:

Ancak Bağımlılık Özellikleri şöyle statik tanımlanmalıdır İşte. Bağımlılık Özelliğini statik olarak bildirme hatası, yukarıdaki hataya neden olur.

+0

Lütfen daha ayrıntılı bir yanıt verin – martianwars

+1

Açıklamam için cevabımı düzenledim. Umarım yeterince ayrıntılıdır. –

İlgili konular