wpf - डब्ल्यूपीएफ में व्यस्त बूलियन गुणों को कैसे बांधें?




.net-3.5 styles (8)

मेरे पास एक वस्तु है जिसमें एक IsReadOnly संपत्ति है। यदि यह संपत्ति सत्य है, तो मैं एक बटन पर IsEnabled प्रॉपर्टी सेट करना IsEnabled , (उदाहरण के लिए), गलत पर।

मैं विश्वास करना चाहता हूं कि मैं इसे आसानी से कर सकता हूं जैसे IsEnabled="{Binding Path=!IsReadOnly}" लेकिन यह WPF के साथ नहीं उड़ता है।

क्या मैं सभी स्टाइल सेटिंग्स के माध्यम से जाने के लिए रवाना हूं? एक और बूल के विपरीत में एक बूल सेट करने के रूप में बस कुछ आसान के लिए बहुत शब्दशः लगता है।

<Button.Style>
    <Style TargetType="{x:Type Button}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=IsReadOnly}" Value="True">
                <Setter Property="IsEnabled" Value="False" />
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=IsReadOnly}" Value="False">
                <Setter Property="IsEnabled" Value="True" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Button.Style>

अपने दृश्य मॉडल में एक और संपत्ति जोड़ें, जो रिवर्स वैल्यू वापस कर देगा। और बटन से बांधें। पसंद;

मॉडल में देखें:

public bool IsNotReadOnly{get{return !IsReadOnly;}}

xaml में:

IsEnabled="{Binding IsNotReadOnly"}

आप एक ValueConverter का उपयोग कर सकते हैं जो आपके लिए एक बूल संपत्ति को बदल देता है।

XAML:

IsEnabled="{Binding Path=IsReadOnly, Converter={StaticResource InverseBooleanConverter}}"

कनवर्टर:

[ValueConversion(typeof(bool), typeof(bool))]
    public class InverseBooleanConverter: IValueConverter
    {
        #region IValueConverter Members

        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");

            return !(bool)value;
        }

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

        #endregion
    }

पता नहीं है कि यह एक्सएएमएल के लिए प्रासंगिक है, लेकिन मेरे सरल विंडोज ऐप में मैंने मैन्युअल रूप से बाइंडिंग बनाई और एक प्रारूप ईवेंट हैंडलर जोड़ा।

public FormMain() {
  InitializeComponent();

  Binding argBinding = new Binding("Enabled", uxCheckBoxArgsNull, "Checked", false, DataSourceUpdateMode.OnPropertyChanged);
  argBinding.Format += new ConvertEventHandler(Binding_Format_BooleanInverse);
  uxTextBoxArgs.DataBindings.Add(argBinding);
}

void Binding_Format_BooleanInverse(object sender, ConvertEventArgs e) {
  bool boolValue = (bool)e.Value;
  e.Value = !boolValue;
}

पॉल के जवाब के बाद, मैंने व्यू मॉडेल में निम्नलिखित लिखा:

public bool ShowAtView { get; set; }
public bool InvShowAtView { get { return !ShowAtView; } }

मुझे आशा है कि यहां एक स्निपेट होने से किसी की मदद मिलेगी, शायद मैं नौसिखिया हूं।
और अगर कोई गलती है, तो कृपया मुझे बताएं!

बीटीडब्ल्यू, मैं @heltonbiker टिप्पणी से भी सहमत हूं - यह निश्चित रूप से सही दृष्टिकोण है यदि आपको इसे 3 गुना से अधिक उपयोग नहीं करना है ...


मैं https://quickconverter.codeplex.com/ का उपयोग करने की सलाह https://quickconverter.codeplex.com/

एक बुलियन को <Button IsEnabled="{qc:Binding '!$P', P={Binding IsReadOnly}}" /> रूप में सरल है: <Button IsEnabled="{qc:Binding '!$P', P={Binding IsReadOnly}}" />

यह आमतौर पर कन्वर्टर्स लिखने के लिए आवश्यक समय को गति देता है।


मैं चाहता था कि मेरा एक्सएएमएल जितना संभव हो उतना सुरुचिपूर्ण बने रहें, इसलिए मैंने अपने साझा पुस्तकालयों में से एक में बूल को लपेटने के लिए एक वर्ग बनाया, निहित ऑपरेटर कक्षा को कोड में एक बूल के रूप में इस्तेमाल करने की इजाजत देते हैं

public class InvertableBool
{
    private bool value = false;

    public bool Value { get { return value; } }
    public bool Invert { get { return !value; } }

    public InvertableBool(bool b)
    {
        value = b;
    }

    public static implicit operator InvertableBool(bool b)
    {
        return new InvertableBool(b);
    }

    public static implicit operator bool(InvertableBool b)
    {
        return b.value;
    }

}

आपके प्रोजेक्ट में आवश्यक परिवर्तन केवल उस संपत्ति को बनाना है जिसे आप उलटा करना चाहते हैं, इसे बदले में बदले

    public InvertableBool IsActive 
    { 
        get 
        { 
            return true; 
        } 
    }

और एक्सएएमएल में वैल्यू या इन्वर्टर के साथ बाध्यकारी पोस्टफिक्स में

IsEnabled="{Binding IsActive.Value}"

IsEnabled="{Binding IsActive.Invert}"

यह भी बेकार बूल के लिए काम करता है।

 [ValueConversion(typeof(bool?), typeof(bool))]
public class InverseBooleanConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (targetType != typeof(bool?))
        {
            throw new InvalidOperationException("The target must be a nullable boolean");
        }
        bool? b = (bool?)value;
        return b.HasValue && !b.Value;
    }

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

    #endregion
}

स्टैंडएंड बाध्यकारी के साथ आपको कन्वर्टर्स का उपयोग करने की आवश्यकता है जो कम हवादार दिखती हैं। इसलिए, मैं आपको अपनी परियोजना CalcBinding को देखने की सलाह देता CalcBinding , जिसे विशेष रूप से इस समस्या और कुछ अन्य लोगों को हल करने के लिए विकसित किया गया था। उन्नत बाध्यकारी के साथ आप एक्सएमएल में सीधे कई स्रोत गुणों के साथ अभिव्यक्ति लिख सकते हैं। कहो, आप कुछ लिख सकते हैं जैसे:

<Button IsEnabled="{c:Binding Path=!IsReadOnly}" />

या

<Button Content="{c:Binding ElementName=grid, Path=ActualWidth+Height}"/>

या

<Label Content="{c:Binding A+B+C }" />

या

<Button Visibility="{c:Binding IsChecked, FalseToVisibility=Hidden}" />

जहां ए, बी, सी, Ischecked - देखने के गुण मॉडल और यह ठीक से काम करेगा

सौभाग्य!





styles