2012-09-06 16 views
9

múltiples necesito para enlazar un TextBox que cumple con dos requisitos:unión a IsEnable

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

Cuando se tira de user.IsEnabled una fuente de datos Me preguntaba si alguien tenía un método fácil para hacer esto.

Aquí es el 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

¿Cómo desea combinar estas dos propiedades? Si ambos son verdaderos o si uno es verdadero? – rrhartjr

+0

Una condición O lógica básica –

Respuesta

6

Como solo necesita un OR lógico, solo necesita dos Disparadores para cada una de las propiedades.

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

puse DataContext a la clase Window cuales tiene una DependencyProperty llamados MyIsEnabled. Obviamente tendrías que modificar para tu particular DataContext.

Aquí está el código subyacente relevante:

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

Espero que ayude!

1

Enlazar IsEnabled utilizando un MultiBinding

+0

Lo intenté, pero Multibinding no está disponible para IsEnable, a menos que haya hecho algo incorrecto –

+1

IsEnabled, not IsEnable? ¿No solo escribes mal tus enlaces? Agregue algo de XAML a su pregunta. –

+0

Así es como lo estoy haciendo actualmente. Pero no quería tener que ajustar todos los controles con ContentControl. Intenté configurar los ejemplos de estilo que se muestran arriba, pero eso arruina mi tema que estoy usando. Como todavía estoy aprendiendo WPF, me preguntaba qué opciones estaban disponibles. –

7

Como GazTheDestroyer dijo que se puede utilizar MultiBinding.

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

Pero debe cambiar las condiciones desencadenantes causan sólo admiten la igualdad

<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 una de las condiciones no se cumple el valor se establece en su valor por defecto o del estilo. Pero no establezca el valor local ya que anula los valores de estilo y desencadenante.

+0

Eso daría como resultado una Y de esos valores. Simplemente podría tener dos 'Trigger's para cada una de esas propiedades. Además, necesitarás enlazar a 'Text.Length' de' TextBox', no a 'Self'. – rrhartjr

+0

Sí, este es el AND, pero Keith necesita O para variantes no conmutadas. O user.IsEbleable OR Text.Length> 0 para habilitar TextBox.Vea los comentarios y la pregunta. –