2012-04-02 11 views
8

मुझे बाध्य होने के लिए ऑब्जेक्ट में पहचाने गए यूनिट सिस्टम के आधार पर रनटाइम पर TextBlocks के StringFormat को निर्धारित करने की आवश्यकता है।बाउंड निर्भरता गुणों के साथ IValueConverter

मेरे पास एक निर्भरता संपत्ति के साथ एक कनवर्टर है जिसे मैं बांधना चाहता हूं। बाउंड मान का उपयोग रूपांतरण प्रक्रिया को निर्धारित करने में किया जाता है।

public class UnitConverter : DependencyObject, IValueConverter 
{ 
    public static readonly DependencyProperty IsMetricProperty = 
     DependencyProperty.Register("IsMetric", typeof(bool), typeof(UnitConverter), new PropertyMetadata(true, ValueChanged)); 

    private static void ValueChanged(DependencyObject source, DependencyPropertyChangedEventArgs e) 
    { 
     ((UnitConverter)source).IsMetric = (bool)e.NewValue; 
    } 

    public bool IsMetric 
    { 
     get { return (bool)this.GetValue(IsMetricProperty); } 
     set { this.SetValue(IsMetricProperty, value); } 
    } 

    object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (IsMetric) 
      return string.Format("{0:0.0}", value); 
     else 
      return string.Format("{0:0.000}", value); 
    } 

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

मैं कनवर्टर घोषित

<my:UnitConverter x:Key="Units" IsMetric="{Binding Path=IsMetric}"/> 

और TextBlock

<TextBlock Text="{Binding Path=Breadth, Converter={StaticResource Units}}" Style="{StaticResource Values}"/> 

कभी बाँध कम, मैं निम्नलिखित त्रुटि मिलती है:

System.Windows.Data त्रुटि: 2: लक्ष्य तत्व के लिए शासकीय फ्रेमवर्क एलिमेंट या फ्रेमवर्ककंटेंट एलिमेंट नहीं मिल रहा है। BindingExpression: पथ = IsMetric; DataItem = बातिल; लक्ष्य तत्व 'यूनिट कनवर्टर' है (हैशकोड = 62641008); लक्ष्य संपत्ति 'IsMetric' है (प्रकार 'बूलियन')

मुझे लगता है कि यह डेटाैकेंटेक्स्ट सेट करने से पहले शुरू हो रहा है और इसलिए IsMetric संपत्ति को बांधने के लिए कुछ भी नहीं है। मैं वांछित परिणाम कैसे प्राप्त कर सकता हूं? एक कनवर्टर के साथ इस तरह

<TextBlock> 
    <TextBlock.Text> 
     <MultiBinding Converter="{StaticResource UnitMultiValueConverter}"> 
      <Binding Path="Breadth" /> 
      <Binding Path="IsMetric" /> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

:

उत्तर

6

बशर्ते कि Breadth और IsMetric एक ही डेटा ऑब्जेक्ट के गुणों को कर रहे हैं, तो आप एक MultiBinding संयोजन के रूप में एक multi value converter साथ उपयोग कर सकते हैं

public class UnitMultiValueConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     double value = (double)values[0]; 
     bool isMetric = (bool)values[1]; 
     string format = isMetric ? "{0:0.0}" : "{0:0.000}"; 
     return string.Format(format, value); 
    } 

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

समस्या आपके दृष्टिकोण के साथ यह है कि जब यूनिट कनवर्टर को संसाधन के रूप में घोषित किया जाता है तो इसमें डेटाकॉन्टेक्स्ट नहीं होता है, और यह कभी भी बाद में नहीं मिलेगा।

और एक और महत्वपूर्ण बात: ValueChangedUnitConverter.IsMetric के लिए कॉलबैक बकवास है। यह वही संपत्ति फिर से सेट करता है जो अभी बदल गया था।

+0

मैं इस से बचने के लिए चाहता था क्योंकि मेरे पास सैकड़ों टेक्स्टब्लॉक हैं और मैं उन सभी को बदलना और नहीं बदलना चाहता था। –

+0

धन्यवाद आदमी, हाँ मुझे एहसास हुआ कि मैं सिर्फ वही संपत्ति स्थापित कर रहा था, ठीक है अगर इसे कभी भी कहा जाता है! मल्टीबाइंडिंग वर्क्स हालांकि महान है –

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