2012-09-06 2 views
9

je dois lier un TextBox qui répond à deux critères:multiples se liant à IsEnable

  • isEnabled si text.length> 0
  • IsEnabled si user.IsEnabled

user.IsEnabled est tiré de une source de données. Je me demandais si quelqu'un avait une méthode facile pour le faire.

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

Comment voulez-vous combiner ces deux propriétés? Si les deux sont vrais ou si l'un est vrai? – rrhartjr

+0

Une logique ou une condition de base –

Répondre

6

Puisque vous avez seulement besoin d'un OR logique, vous avez juste besoin de deux déclencheurs pour chacune de vos propriétés.

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

Je mis DataContext à la classe Window qui a un DependencyProperty appelé MyIsEnabled. Évidemment, vous devrez modifier pour votre DataContext.

Voici le code-behind pertinent:

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

Hope that helps!

1

Bind IsEnabled utilisant un MultiBinding

+0

J'ai essayé mais la liaison multiple n'est pas disponible pour IsEnable, sauf si j'ai fait quelque chose de mal –

+1

IsEnabled, pas IsEnable? Ne vous trompez-vous pas dans vos fixations? Ajoutez du XAML à votre question. –

+0

Voici comment je le fais actuellement. Mais je ne voulais pas avoir à emballer tous les contrôles avec un ContentControl. J'ai essayé de mettre en place les exemples de style ci-dessus, mais cela gâche mon thème que j'utilise. Depuis que j'apprends toujours WPF, je me demandais quelles options étaient disponibles. –

7

Comme GazTheDestroyer dit que vous pouvez utiliser MultiBinding.

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

Mais vous devez changer les conditions provoquent des déclencheurs prennent en charge que l'égalité

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

Si l'une des conditions est pas satisfait, la valeur est définie à sa valeur par défaut ou du style. Mais ne définissez pas de valeur locale car elle remplace les valeurs de style et de déclenchement.

+0

Cela aurait pour résultat un ET de ces valeurs. Vous pourriez simplement avoir deux 'Trigger's pour chacune de ces propriétés. En outre, vous devez associer à 'Text.Length'' TextBox', pas 'Self'. – rrhartjr

+0

Oui, c'est l'AND, mais Keith a besoin de OU pour les variantes non commutées. Soit user.IsEnabled OU Text.Length> 0 pour activer TextBox.Voir les commentaires ander la question. –

Questions connexes