2012-09-06 11 views
9

के लिए बाध्य मैं एक TextBox बाध्य करने के लिए है कि दो मानदंडों को पूरा करती जरूरत एक डेटा स्रोत। मैं सोच रहा था कि क्या ऐसा करने के लिए किसी के पास आसान तरीका है।कई IsEnable

<ContentControl IsEnabled="{Binding Path=Enabled, Source={StaticResource UserInfo}}"> 
    <TextBox DataContext="{DynamicResource UserInfo}" Text="{Binding FirstName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsEnabled="{Binding Path=Text, RelativeSource={RelativeSource Self}, Converter={StaticResource LengthToBool}}"/> 
</ContentControl> 
+0

आप इन दोनों संपत्तियों को संयुक्त कैसे चाहते हैं? अगर दोनों सच हैं या कोई सच है? – rrhartjr

+0

एक मूल तर्क या शर्त –

उत्तर

6

चूंकि आपको केवल तार्किक OR की आवश्यकता है, इसलिए आपको अपनी प्रत्येक संपत्ति में केवल दो ट्रिगर की आवश्यकता है।

इस XAML का प्रयास करें:

<StackPanel> 
     <StackPanel.Resources> 
      <Style TargetType="{x:Type Button}"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding ElementName=InputText, Path=Text}" Value="" > 
         <Setter Property="IsEnabled" Value="False" /> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding Path=MyIsEnabled}" Value="False" > 
         <Setter Property="IsEnabled" Value="False" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </StackPanel.Resources> 
     <StackPanel Orientation="Horizontal"> 
      <Label>MyIsEnabled</Label> 
      <CheckBox IsChecked="{Binding Path=MyIsEnabled}" /> 
     </StackPanel> 
     <TextBox Name="InputText">A block of text.</TextBox> 
     <Button Name="TheButton" Content="A big button.">  
     </Button> 
    </StackPanel> 

मैं Window वर्ग है जो एक DependencyPropertyMyIsEnabled कहा जाता है के लिए DataContext निर्धारित किया है। जाहिर है आपको अपने विशेष DataContext के लिए संशोधित करना होगा।

public bool MyIsEnabled 
{ 
    get { return (bool)GetValue(IsEnabledProperty); } 
    set { SetValue(IsEnabledProperty, value); } 
} 

public static readonly DependencyProperty MyIsEnabledProperty = 
    DependencyProperty.Register("MyIsEnabled", typeof(bool), typeof(MainWindow), new UIPropertyMetadata(true)); 


public MainWindow() 
{ 
    InitializeComponent(); 
    this.DataContext = this; 
} 

आशा है कि मदद करता है:

यहाँ प्रासंगिक कोड-पीछे है!

1

बाइंड IsEnabled एक MultiBinding

+0

मैंने कोशिश की लेकिन मल्टीबाइंडिंग IsEnable के लिए उपलब्ध नहीं है, जब तक मैंने कुछ गलत नहीं किया –

+1

IsEnabled, IsEnable नहीं है? क्या आप बस अपनी बाध्यताओं में गलत टाइप नहीं करते? अपने प्रश्न में कुछ एक्सएएमएल जोड़ें। –

+0

इस प्रकार मैं वर्तमान में इसे कर रहा हूं। लेकिन मैं कंटेंट कंट्रोल के साथ हर नियंत्रण को लपेटना नहीं चाहता था। मैंने उपरोक्त शैली के उदाहरणों को स्थापित करने की कोशिश की, लेकिन यह मेरी थीम को गड़बड़ कर रहा है जिसका मैं उपयोग कर रहा हूं। चूंकि मैं अभी भी डब्ल्यूपीएफ सीख रहा हूं, मैं सोच रहा था कि कौन से विकल्प उपलब्ध थे। –

7

का उपयोग कर के रूप में GazTheDestroyer कहा कि तुम MultiBinding उपयोग कर सकते हैं:

यहाँ XAML है।

You can also acomplish this with XAML-only solution using MultiDataTrigger

लेकिन आप स्थितियों के कारण बदल देना चाहिए चलाता केवल समानता का समर्थन

<Style.Triggers> 
    <MultiDataTrigger> 
     <MultiDataTrigger.Conditions> 
      <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=Text.Length}" Value="0" /> 
      <Condition Binding="{Binding Source=... Path=IsEnabled}" Value="False" /> 
     </MultiDataTrigger.Conditions> 
     <Setter Property="IsEnabled" Value="False" /> 
     </MultiDataTrigger> 
</Style.Triggers> 

अगर हालत में से एक मूल्य को उसके डिफ़ॉल्ट या शैली से मान पर सेट किया पूरा नहीं होता है। लेकिन स्थानीय मान सेट न करें क्योंकि यह स्टाइल और ट्रिगर के मानों को ओवरराइड करता है।

+0

जिसके परिणामस्वरूप उनमें से एक और मूल्य होगा। आप बस उन गुणों में से प्रत्येक के लिए दो 'ट्रिगर' हो सकते हैं। साथ ही, आपको 'टेक्स्टबॉक्स' के 'टेक्स्ट' लम्बाई 'से जुड़ना होगा, न कि' सेल्फ '। – rrhartjr

+0

हां, यह और है, लेकिन कीथ की आवश्यकता है या वेरिएंट स्विच नहीं हैं। टेक्स्टबॉक्स को सक्षम करने के लिए या तो उपयोगकर्ता। सक्षम या टेक्स्ट। लम्बाई> 0।टिप्पणियां और सवाल देखें। –

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