2009-05-08 11 views
39

के रूप में एक बूल मान प्रदर्शित करें मेरे पास एक बूल वैल्यू है जिसे मुझे टेक्स्टब्लॉक में "हां" या "नहीं" के रूप में प्रदर्शित करने की आवश्यकता है। मैं इसे स्ट्रिंगफॉर्मेट के साथ करने की कोशिश कर रहा हूं, लेकिन मेरी स्ट्रिंगफॉर्मेट को अनदेखा कर दिया गया है और टेक्स्टब्लॉक "ट्रू" या "गलत" प्रदर्शित करता है।डब्ल्यूपीएफ: "हां"/"नहीं"

<TextBlock Text="{Binding Path=MyBoolValue, StringFormat='{}{0:Yes;;No}'}" /> 

क्या मेरे वाक्यविन्यास में कुछ गड़बड़ है, या इस प्रकार का स्ट्रिंगफॉर्मैट समर्थित नहीं है?

मुझे पता है कि मैं इसे पूरा करने के लिए वैल्यू कनवर्टर का उपयोग कर सकता हूं, लेकिन स्ट्रिंगफॉर्मेट समाधान अधिक सुरुचिपूर्ण लगता है (अगर यह काम करता है)।

उत्तर

37

स्ट्रिंगफॉर्मैट के साथ आपका समाधान काम नहीं कर सकता है, क्योंकि यह वैध प्रारूप स्ट्रिंग नहीं है।

मैंने एक मार्कअप एक्सटेंशन लिखा जो आप चाहते हैं कि वह करेगा। आप इसे इस तरह का उपयोग कर सकते हैं:

<TextBlock Text="{my:SwitchBinding MyBoolValue, Yes, No}" /> 

यहाँ मार्कअप विस्तार के लिए कोड:

public class SwitchBindingExtension : Binding 
{ 
    public SwitchBindingExtension() 
    { 
     Initialize(); 
    } 

    public SwitchBindingExtension(string path) 
     : base(path) 
    { 
     Initialize(); 
    } 

    public SwitchBindingExtension(string path, object valueIfTrue, object valueIfFalse) 
     : base(path) 
    { 
     Initialize(); 
     this.ValueIfTrue = valueIfTrue; 
     this.ValueIfFalse = valueIfFalse; 
    } 

    private void Initialize() 
    { 
     this.ValueIfTrue = Binding.DoNothing; 
     this.ValueIfFalse = Binding.DoNothing; 
     this.Converter = new SwitchConverter(this); 
    } 

    [ConstructorArgument("valueIfTrue")] 
    public object ValueIfTrue { get; set; } 

    [ConstructorArgument("valueIfFalse")] 
    public object ValueIfFalse { get; set; } 

    private class SwitchConverter : IValueConverter 
    { 
     public SwitchConverter(SwitchBindingExtension switchExtension) 
     { 
      _switch = switchExtension; 
     } 

     private SwitchBindingExtension _switch; 

     #region IValueConverter Members 

     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      try 
      { 
       bool b = System.Convert.ToBoolean(value); 
       return b ? _switch.ValueIfTrue : _switch.ValueIfFalse; 
      } 
      catch 
      { 
       return DependencyProperty.UnsetValue; 
      } 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      return Binding.DoNothing; 
     } 

     #endregion 
    } 

} 
+1

आप सही हैं, यह एक बूल मान के लिए मान्य प्रारूप स्ट्रिंग नहीं है (यह संख्यात्मक मानों के लिए मान्य है)। मैं इस तरह की प्रारूप स्ट्रिंग का परीक्षण कर रहा था: string.Format ("{0: Yes ;; No}", 1), जो "हां" देता है, लेकिन स्ट्रिंग। फोर्मेट ("{0: हाँ ;; नहीं}", सत्य) "सच" देता है। धन्यवाद –

+0

क्या आप कृपया सुझाव दे सकते हैं, मैं इस कनवर्टर का उपयोग कर बाध्यकारी करते समय ElementName का उपयोग कैसे करूं? –

+0

@conqenator, बस एक सामान्य बाध्यकारी –

53

तुम भी this great value converter

तो उपयोग कर सकते हैं आप इस तरह XAML कुछ में घोषित:

<local:BoolToStringConverter x:Key="BooleanToStringConverter" FalseValue="No" TrueValue="Yes" /> 

और आप इसे इस तरह उपयोग कर सकते हैं:

<TextBlock Text="{Binding Path=MyBoolValue, Converter={StaticResource BooleanToStringConverter}}" /> 
+0

यह वास्तव में साफ अवधारणा है – pomeroy

+0

शानदार, इसे साझा करने के लिए धन्यवाद। – GrandMasterFlush

+0

बढ़िया! धन्यवाद :) –

25

कनवर्टर के बिना

  <TextBlock.Style> 
       <Style TargetType="{x:Type TextBlock}"> 
        <Setter Property="Text" Value="OFF" /> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding MyBoolValue}" Value="True"> 
          <Setter Property="Text" Value="ON" /> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </TextBlock.Style> 
+0

मिठास। धन्यवाद। –

+0

मुझे यह समाधान पसंद है। मुझे पता है कनवर्टर एक आम समाधान है; हालांकि, बड़े अनुप्रयोगों में, ऐसा लगता है कि समस्या से निपटने के लिए बेहतर है ('DataTrigger' के माध्यम से क्योंकि आप एकल केस कन्वर्टर्स के एक टन के साथ समाप्त हो सकते हैं)। – Thomas

+1

आपको सच्चे और झूठे दोनों के लिए ट्रिगर नहीं होना चाहिए, यह अनावश्यक है और समस्याएं पैदा कर सकता है। इस उदाहरण में आपको संपत्ति के लिए एक डिफ़ॉल्ट सेटटर और एक 'डेटा ट्रिगर' सेट करना चाहिए। –

1

इस के साथ "हार्ड-कोडेड" हां/नहीं मान

[ValueConversion(typeof (bool), typeof (bool))] 
public class YesNoBoolConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var boolValue = value is bool && (bool) value; 

     return boolValue ? "Yes" : "No"; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return value != null && value.ToString() == "Yes"; 
    } 
} 

XAML प्रयोग

<DataGridTextColumn Header="Is Listed?" Binding="{Binding Path=IsListed, Mode=TwoWay, Converter={StaticResource YesNoBoolConverter}}" Width="110" IsReadOnly="True" TextElement.FontSize="12" /> 
3

वहाँ भी है एक और विकल्प कनवर्टर सरलीकृत है एक और वास्तव में महान विकल्प। इसे जांचें: Alex141 CalcBinding

मेरे डेटा ग्रिड में, मैं केवल है:

<DataGridTextColumn Header="Mobile?" Binding="{conv:Binding (IsMobile?\'Yes\':\'No\')}" /> 

इसका इस्तेमाल करने के लिए आपको केवल GitHub के माध्यम से CalcBinding जोड़ने के लिए, UserControl/विंडोज घोषणा की तुलना में, आप जोड़ना

<Windows XXXXX xmlns:conv="clr-namespace:CalcBinding;assembly=CalcBinding"/> 
0

निम्नलिखित ने मेरे लिए डेटाग्रिडटेक्स्ट कॉलम के अंदर काम किया: मैंने अपनी कक्षा में एक और संपत्ति जोड़ा जो मायबूल के मूल्य के आधार पर एक स्ट्रिंग लौटा दी। ध्यान दें कि मेरे मामले में डेटाग्रिड MyClass ऑब्जेक्ट्स के कलेक्शन व्यूसोर्स से जुड़ा हुआ था।

सी #:

public class MyClass   
{  
    public bool MyBool {get; set;} 

    public string BoolString  
    {  
     get { return MyBool == true ? "Yes" : "No"; }  
    }  
}   

XAML:

<DataGridTextColumn Header="Status" Binding="{Binding BoolString}"> 
2

यह एक समाधान का उपयोग कर एक Converter और ConverterParameter जिसे आप आसानी से अलग Bindings के लिए अलग strings परिभाषित करने के लिए अनुमति देता है:

public class BoolToStringConverter : IValueConverter 
{ 
    public char Separator { get; set; } = ';'; 

    public object Convert(object value, Type targetType, object parameter, 
          CultureInfo culture) 
    { 
     var strings = ((string)parameter).Split(Separator); 
     var trueString = strings[0]; 
     var falseString = strings[1]; 

     var boolValue = (bool)value; 
     if (boolValue == true) 
     { 
      return trueString; 
     } 
     else 
     { 
      return falseString; 
     } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, 
           CultureInfo culture) 
    { 
     var strings = ((string)parameter).Split(Separator); 
     var trueString = strings[0]; 
     var falseString = strings[1]; 

     var stringValue = (string)value; 
     if (stringValue == trueString) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
} 

सी परिभाषित करें onverter इस तरह:

<local:BoolToStringConverter x:Key="BoolToStringConverter" /> 

और यह इस तरह का उपयोग करें:

<TextBlock Text="{Binding MyBoolValue, Converter={StaticResource BoolToStringConverter}, 
             ConverterParameter='Yes;No'}" /> 

आप ; तुलना में एक अलग विभाजक की जरूरत है (उदाहरण के . के लिए), कनवर्टर इस के बजाय तरह परिभाषित करते हैं:

<local:BoolToStringConverter x:Key="BoolToStringConverter" Separator="." />