2015-01-25 5 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, इस त्रुटि कनवर्टर में अपनी निर्भरता संपत्ति की वजह से नहीं है (और बाद कहीं से पहले इस कनवर्टर का एक उदाहरण बनाया था) स्थिर किया जा रहा है।

संपादित

तो समस्या इस लाइन के साथ है:

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

यहाँ निर्भरता संपत्ति MaterialsListProperty इस प्रकार है (यानी LEGOMaterialConverter) का एक उद्देश्य के हर इन्स्टेन्शियशन के साथ पंजीकृत किया जा रहा है । इस प्रकार के सभी भावी अवसरों के लिए

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

एक स्थिर चर आरंभ नहीं हो जाता है (और निर्भरता संपत्ति पंजीकृत है) केवल एक बार और है कि हम क्या जरूरत है:

हालांकि निर्भरता गुण स्थिर परिभाषित किया जाना चाहिए, ताकि जैसे यहाँ। ऊपर से त्रुटि में स्थैतिक परिणाम के रूप में एक निर्भरता संपत्ति घोषित करने में विफल।

+0

कृपया एक और विस्तृत उत्तर प्रदान करें – martianwars

+1

मैंने स्पष्ट करने के लिए अपना उत्तर संपादित कर दिया है। उम्मीद है कि वर्बोज़ पर्याप्त है। –

संबंधित मुद्दे