2010-07-29 15 views
34

मेरे पास चेकबॉक्स के साथ प्रस्तुत बूलियन की एक संपत्ति है।डब्ल्यूपीएफ रेडियोबूटटन (दो) (बूलियन मान के लिए बाध्यकारी)

मैं इसे दो रेडियोबुटन्स में बदलना चाहता हूं जो एक ही संपत्ति पर सही सत्य/झूठी पेश करते हैं।

यह कैसे किया जा सकता है?

उत्तर

60
<RadioButton GroupName="Group1" 
      IsChecked="{Binding PropertyValue}" Content="Yes" /> 
<RadioButton GroupName="Group1" Content="No" 
      IsChecked="{Binding PropertyValue, 
         Converter={StaticResource BoolInverterConverter}}" /> 
public class BoolInverterConverter : IValueConverter 
{ 
    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, 
     System.Globalization.CultureInfo culture) 
    { 
     if (value is bool) 
     { 
      return !(bool)value; 
     } 
     return value; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, 
     System.Globalization.CultureInfo culture) 
    { 
     if (value is bool) 
     { 
      return !(bool)value; 
     } 
     return value; 
    } 

    #endregion 
} 
+0

बहुत बहुत धन्यवाद! – no9

+23

किसी कारण से मुझे दो अलग-अलग समूह नामों का उपयोग करना होगा। अन्यथा, व्यूमोडेल में बूलियन को सत्य पर सेट किया जा सकता है, लेकिन कभी भी गलत पर रीसेट नहीं किया जाता है (भले ही रेडियो बटन ठीक से व्यवहार करने लगते हैं) – Qwertie

+0

हाय, आप दूसरे रेडियो बटन को बंद करने के लिए "/" भूल गए हैं। –

9

आप एक मूल्य कनवर्टर कि बूलियन मान reverts उपयोग कर सकते हैं:,

कि कनवर्टर के साथ

कनवर्टर और कनवर्टर के साथ एक CheckBox.IsChecked-संपत्ति के बिना बूलियन मान को एक Checkbox.IsChecked-संपत्ति के लिए बाध्य। यह काम कर जाना चाहिए।

यहाँ

इस तरह के एक कनवर्टर के लिए कोड। मैंने इसे here से कॉपी किया है और कोड की कुछ पंक्तियां जोड़ दी हैं। वहां आपको अधिक जानकारी मिल जाएगी।

public class BoolToOppositeBoolConverter : IValueConverter { 
    public object Convert(object value, Type targetType, object parameter,System.Globalization.CultureInfo culture) { 
     if (targetType != typeof(bool)) { 
      throw new InvalidOperationException("The target must be a boolean"); 
     } 
     if (null == value) { 
      return null; 
     } 
        return !(bool)value; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter,System.Globalization.CultureInfo culture) { 
     if (targetType != typeof(bool)) { 
      throw new InvalidOperationException("The target must be a boolean"); 
     } 
     if (null == value) { 
      return null; 
     } 
     return !(bool)value; 
    } 
} 

इसके इस्तेमाल के लिये संसाधन अनुभाग में यह घोषणा।

<local:BoolToOppositeBoolConverter x:Key="BoolToOppositeBoolConverter_ValueConverter"/> 

और यह एक स्थिर संसाधन के रूप में उपयोग बंधन में:

<CheckBox IsChecked="{Binding YourProperty}" /> 
<CheckBox IsChecked="{Binding YourProperty,Converter={StaticResource BoolToOppositeBoolConverter_ValueConverter}}" /> 

कृपया ध्यान दें, कनवर्टर केवल एक सरल उदाहरण है। यदि आप इसे उत्पादक कोड में उपयोग करना चाहते हैं तो इसे अच्छी तरह कार्यान्वित करें। मैंने इसका परीक्षण नहीं किया है। अगर यह काम नहीं कर रहा है तो एक टिप्पणी करें।

+1

thanx! मैंने रागुनाथन समाधान का उपयोग किया है, लेकिन दोनों महान काम करते हैं। Speacialy मैं आपके स्पष्टीकरण और समय के लिए धन्यवाद के लिए धन्यवाद देना चाहता हूँ। धीरे-धीरे मैं WPF में अपना रास्ता खोद रहा हूं ... – no9

2

आप अगर आप एक ही मूल्य (ताकि केवल एक समय में जाँच की जा सकती) के लिए दोनों रेडियो बटन के GroupName गुण सेट एक कनवर्टर के बिना इस लक्ष्य को हासिल कर सकते हैं। फिर, एक रेडियो बटन को "ट्रू" में चेक करें, और अपने बूलियन में किसी अन्य की जांच करें। रेडियो बटन स्विच करने से बूलियन मान बदल जाएगा, हालांकि, बूलियन मान को गलत में बदलना अन्य रेडियो बटन की जांच नहीं करेगा।

धन्यवाद, Vlad

+1

यदि आप अपना संवाद कई बार दिखाते हैं तो इस दृष्टिकोण में एक बाध्यकारी बाध्यकारी दुष्प्रभाव होता है। मैं संवाद बंद करने से पहले डेटा संदर्भ संपत्ति की सफाई करके इसे काम करने में सक्षम था, इसलिए यह मेरे लिए एक फ्रेमवर्क मुद्दा की तरह दिखता है। भले ही, मैं एक बेहतर समाधान के साथ आया जो बूलियन और गणनाओं का समर्थन करता है, और समूह नाम संपत्ति सेट या नहीं, ठीक से काम करता है। – votrubac

1
यहाँ

कैसे नमूना कोड के साथ किसी भी प्रकार (गणन, बूलियन, स्ट्रिंग, पूर्णांक, आदि) के लिए रेडियो बटन बाध्य करने पर समाधान है:

http://www.codeproject.com/Tips/720497/Binding-Radio-Buttons-to-a-Single-Property

+0

+1 मेरे लिए काम करने वाला एकमात्र समाधान। –

3

मानक बाध्यकारी दृष्टिकोण के रूप में "का चयन रद्द किया" बाइंडिंग सेटर फायरिंग जब भी यूआई भरी हुई है दुर्भाग्यपूर्ण दुष्परिणाम है। इसलिए यदि आप अपने bool के लिए सेटर में उपयोगकर्ता के क्लिक के संभालने के लिए कोड मिल गया है, यह सेटर "गलत" भले ही आप इसे एक "सही" bool करने के लिए बाध्य कर दिया है आग की तरह कुछ अजीब सामान करेंगे।

public class BoolRadioConverter : IValueConverter 
{ 
    public bool Inverse { get; set; } 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     bool boolValue = (bool) value; 

     return this.Inverse ? !boolValue : boolValue; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     bool boolValue = (bool)value; 

     if (!boolValue) 
     { 
      // We only care when the user clicks a radio button to select it. 
      return null; 
     } 

     return !this.Inverse; 
    } 
} 

अपने संसाधनों में:

<converters:BoolRadioConverter x:Key="BoolRadioConverter" /> 
<converters:BoolRadioConverter x:Key="InverseBoolRadioConverter" Inverse="True" /> 

अपने XAML में:

<RadioButton 
    Content="True option" 
    GroupName="radioGroup1" 
    IsChecked="{Binding MyProperty, 
         Converter={StaticResource BoolRadioConverter}}" /> 
<RadioButton 
    Content="False option" 
    GroupName="radioGroup2" 
    IsChecked="{Binding MyProperty, 
         Converter={StaticResource InverseBoolRadioConverter}}" /> 
+0

बढ़िया! मेरी समस्या के लिए अपेक्षित काम करता है। भविष्य में संदर्भ – EvilInside

+0

के लिए मेरे ब्लॉग पर क्लिक करने के लिए कॉपी किया गया है और यदि मैं इसे 'इनवर्क्सबूलराडियो कनवर्टर' कहता हूं तो मैं इनवर्स वेरिएबल को अनदेखा कर सकता हूं और सत्य वापस कर सकता हूं क्योंकि मैं हमेशा इसे रेडियो बटन के लिए कनवर्टर के रूप में उपयोग करता हूं। – Maxoizs

0

ragunathan की सरलीकृत संस्करण

मैं एक कनवर्टर रेडियो बटन के लिए विशेष रूप से प्रयोग किया जाता है के साथ इस के आसपास मिल गया answer है।

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) => 
    Convert(value); 

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) => 
    Convert(value); 

private object Convert(object value) => 
    value is bool ? !(bool)value : value; 
संबंधित मुद्दे