DataTrigger使WPF按钮处于非活动状态,直到TextBox具有值

Joh*_*hnB 7 .net wpf xaml binding

我希望Button控件的属性IsEnabled="False"直到将值输入到a TextBoxWindow.

代码到目前为止:

<Button
  Content="Click Me"
  Name="ClickMe"
  VerticalAlignment="Top"
  Click="ClickMe_Click">
  <Button.Style>
    <Style>
      <Style.Triggers>
        <DataTrigger
          Binding="{Binding ElementName=textBox, Path=Length}"
          <!-- or even: Binding="{Binding Path=textBox.Length}" -->
          Value="0">
          <Setter
            Property="Button.IsEnabled"
            Value="false" />
          </DataTrigger>
      </Style.Triggers>
    </Style>
  </Button.Style>
</Button>
Run Code Online (Sandbox Code Playgroud)

此外,是否可以将此Button控件的IsEnabled属性基于3个TextBox具有值的不同控件?

Jay*_*Jay 6

假设您使用的是演示模型,例如ViewModel,则应直接绑定数据而不是UI元素.

<Style.Triggers>
    <MultiDataTrigger>
        <MultiDataTrigger.Conditions>
            <Condition Binding="{Binding FirstName}" Value="{x:Null}" />
            <Condition Binding="{Binding MiddleName}" Value="{x:Null}" />
            <Condition Binding="{Binding LastName}" Value="{x:Null}" />
        </MultiDataTrigger.Conditions>
        <Setter Property="Button.IsEnabled" Value="False" />
    </MultiDataTrigger>
</Style.Triggers>
Run Code Online (Sandbox Code Playgroud)

也就是说,如果您使用的是演示模型,则可以随时添加bool"EnableSave"属性并处理其中的所有表示逻辑,而不是在视图本身中.

更新

由于可以通过以下的评论中可以看出,我错误地将此设为启用Button时,任何 TextBox具有价值,但要求是,Button当启用所有 TextBox ES具有值.

从概念上讲,你所要做的就是扭转条件 - 而不是"假如果所有条件都是假的",我们希望"如果所有条件都是真的,则为真".

问题是,在XAML中没有办法说"not null" - 没有办法IValueConverter,就是这样.我会创建一个NullToBoolConverter返回falsefor nulltruefor != null.

鉴于这样的转换器:

<Style.Triggers>
    <MultiDataTrigger>
        <MultiDataTrigger.Conditions>
            <Condition Binding="{Binding FirstName,
                Converter={StaticResource NullToBoolConverter}}" Value="True" />
            <Condition Binding="{Binding MiddleName,
                Converter={StaticResource NullToBoolConverter}}" Value="True" />
            <Condition Binding="{Binding LastName,
                Converter={StaticResource NullToBoolConverter}}" Value="True" />
        </MultiDataTrigger.Conditions>
        <Setter Property="Button.IsEnabled" Value="True" />
    </MultiDataTrigger>
</Style.Triggers>
Run Code Online (Sandbox Code Playgroud)