2012-09-06 3 views
9

Ich brauche eine TextBox zu binden, die zwei Kriterien erfüllt:mehrere zu IsEnable Bindung

  • IsEnabled wenn text.length> 0
  • IsEnabled wenn

user.IsEnabled Wo user.IsEnabled gezogen wird aus eine Datenquelle Ich habe mich gefragt, ob jemand eine einfache Methode dafür hätte. Hier

ist die XAML:

<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

Wie möchten Sie diese beiden Eigenschaften kombiniert? Wenn beide wahr sind oder wenn man wahr ist? – rrhartjr

+0

Eine grundlegende logische ODER-Bedingung –

Antwort

6

Da Sie nur eine logische OR benötigen, brauchen Sie nur zwei Trigger zu jeder der Eigenschaften.

Versuchen Sie, diese 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> 

Ich habe DataContext auf die Window Klasse, die ein DependencyPropertyMyIsEnabled genannt hat. Natürlich müssten Sie für Ihre speziellen DataContext ändern.

Hier ist der entsprechende Code-behind:

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; 
} 

Hoffnung, das hilft!

1

Bind IsEnabled mit einem MultiBinding

+0

Ich habe versucht, aber Multibinding ist nicht verfügbar für IsEnable, es sei denn, ich habe etwas falsch gemacht –

+1

IsEnabled, nicht IsEnable? Verpatzst du nicht einfach deine Bindungen? Fügen Sie Ihrer Frage ein XAML hinzu. –

+0

So mache ich es gerade. Aber ich wollte nicht jedes Steuerelement mit einem ContentControl umschließen. Ich habe versucht, die oben gezeigten Stilbeispiele einzurichten, aber das vermasselt mein Theme, das ich verwende. Da ich immer noch WPF lerne, habe ich mich gefragt, welche Möglichkeiten verfügbar sind. –

7

Wie GazTheDestroyer gesagt, Sie können Multibinding.

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

Aber Sie sollten die Bedingungen wechseln verursachen Trigger unterstützen nur Gleichheit

<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> 

Wenn einer der Bedingung nicht den Wert auf seinen Standard oder Wert eingestellt werden, vom Stil erfüllt ist. Setzen Sie jedoch keinen lokalen Wert, da er die Werte von Stil und Trigger überschreibt.

+0

Dies würde zu einem AND dieser Werte führen. Sie könnten einfach zwei Trigger zu jeder dieser Eigenschaften haben. Außerdem müssten Sie an TextBox '' Text.Length' binden, nicht an 'Self'. – rrhartjr

+0

Ja, das ist das AND, aber Keith braucht OR für nicht geschaltete Varianten. Entweder user.IsEnabled ODER Text.Length> 0 zum Aktivieren von TextBox.Siehe die Kommentare unter der Frage. –

Verwandte Themen