通过DataTrigger更改Button IsEnabled状态

时间:2011-07-22 22:49:17

标签: c# wpf xaml .net-3.5 triggers

我正在尝试根据TextBox.TextChanged事件或ComboBox.SelectionChanged事件更改按钮的IsEnabled状态。我试图用事件执行此操作,但正在加载的数据正在更改启用状态。我正在使用文本框和组合框填充WPF UIElement网格。网格正通过List的ItemSource填充。

我正在寻找的是包含要填充数据的网格和启用应用按钮状态的编辑器设置为false,直到用户更改文本框或组合框的数据。那时DataTrigger应该触发并将btnApply.IsEnabled更改为true。我不确定要为事件的价值提供什么,但“真实”似乎不正确,而且True和HasChanged不起作用。

我向除DataTrigger之外的其他方法持开放态度,前提是当控件呈现给用户时,IsEnabled为false是默认值。

这是我到目前为止所做的:

  <UserControl.Resources>
    <Style x:Key="tbChanged" TargetType="{x:Type Button}">
      <Style.Triggers>
        <DataTrigger Binding="{Binding Path=TextBox.TextChanged}" Value="HasChanged">
          <Setter Property="Button.IsEnabled" Value="True"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=ComboBox.SelectionChanged}" Value="HasChanged">
          <Setter Property="Button.IsEnabled" Value="True"/>
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </UserControl.Resources>

  <Button x:Name="btnApply" Content="Apply" Height="22" Width="50" Margin="5,5,0,0"  HorizontalAlignment="Left" VerticalAlignment="Top" IsEnabled="False" Click="btnApply_Click" Style="{StaticResource tbChanged}"/> 

1 个答案:

答案 0 :(得分:2)

这些触发器不适用于此,它们处于活动状态或非活动状态,这意味着它们具有时间轴,而事件则不然。您可以使用Blend SDK中的互动,其EventTrigger可以调用ChangePropertyAction,例如。

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
<TextBox Name="myTextBox" />
<ComboBox Name="myComboBox" />
<Button IsEnabled="False" Content="Test">
    <i:Interaction.Triggers>
        <i:EventTrigger SourceName="myTextBox" EventName="TextChanged">
            <ei:ChangePropertyAction PropertyName="IsEnabled" Value="True"/>
        </i:EventTrigger>
        <i:EventTrigger SourceName="myComboBox" EventName="SelectionChanged">
            <ei:ChangePropertyAction PropertyName="IsEnabled" Value="True"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Button>

还有原生EventTriggers,但它们非常受限制,您可能无法使用它们完成此操作。