多重绑定到IsEnabled

时间:2012-09-06 19:36:07

标签: wpf textbox contentcontrol isenabled

我需要绑定符合两个条件的TextBox

  • IsEnabled if Text.Length> 0
  • IsEnabled if user.IsEnabled

从数据源中提取user.IsEnabled的位置。我想知道是否有人有一个简单的方法来做到这一点。

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

3 个答案:

答案 0 :(得分:7)

正如GazTheDestroyer所说,你可以使用MultiBinding。

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>

如果不满足其中一个条件,则将值设置为其默认值或样式中的值。但是不要设置本地值,因为它会覆盖样式和触发器的值。

答案 1 :(得分: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>

我将DataContext设置为Window类,其中DependencyProperty名为MyIsEnabled。显然,你必须修改你的特定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;
}

希望有所帮助!

答案 2 :(得分:1)

使用MultiBinding

绑定IsEnabled