簡體   English   中英

通過XAML在WPF中對TextBox的TextChanged事件啟用/禁用按鈕

[英]Enable/disable Button on TextChanged event of TextBox in WPF by XAML

WPF中有TextBox和Button控件:

<TextBox Name="BackUpTextBox" />
<Button  Name="BackUpSave" Content="Save" />

如果更改了BackUpTextBox的文本,則必須啟用按鈕BackUpSave。 我知道如何通過C#代碼的BackUpTextBox TextChanged事件來做到這一點。 但是,有沒有一種方法可以通過XAML表示法啟用/禁用按鈕?

您可以通過EventTrigger實現。 將兩個控件都包裝在StackPanel以便將TextChanged 事件路由到其父StackPanel中

在那種情況下,通過將IsEnabled設置為True來啟用Button。

<StackPanel>
   <TextBox x:Name="BackUpTextBox"/>
   <Button x:Name="BackUpSave" Content="Save" IsEnabled="False"/>
   <StackPanel.Triggers>
      <EventTrigger RoutedEvent="TextBox.TextChanged">
         <BeginStoryboard>
           <Storyboard>
            <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsEnabled"
                                            Storyboard.TargetName="BackUpSave">
                <DiscreteBooleanKeyFrame KeyTime="0:0:0" Value="True"/>
            </BooleanAnimationUsingKeyFrames>
           </Storyboard>
        </BeginStoryboard>
     </EventTrigger>
     <EventTrigger RoutedEvent="Button.Click">
       <BeginStoryboard>
         <Storyboard>
          <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsEnabled"
                                          Storyboard.TargetName="BackUpSave">
                 <DiscreteBooleanKeyFrame KeyTime="0:0:0" Value="False"/>
          </BooleanAnimationUsingKeyFrames>
         </Storyboard>
       </BeginStoryboard>
     </EventTrigger>
     <EventTrigger RoutedEvent="Loaded">
       <BeginStoryboard>
         <Storyboard>
          <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsEnabled"
                                          Storyboard.TargetName="BackUpSave">
                 <DiscreteBooleanKeyFrame KeyTime="0:0:0" Value="False"/>
          </BooleanAnimationUsingKeyFrames>
         </Storyboard>
       </BeginStoryboard>
     </EventTrigger>
  </StackPanel.Triggers>
</StackPanel>

UPDATE

如果您想再次禁用按鈕單擊按鈕,請Button.Click添加另一個事件處理程序,然后將其設置為禁用。 我已經為此更新了xaml代碼。


更新2

解決方案看起來很麻煩,與僅在Initial,TextChanged和Click事件中設置IsEnabled屬性相比,我懷疑它是否值得。 這些天,我是否錯過了一些更喜歡XAML風格的東西?

是的,我必須同意僅XAML的解決方案有時很麻煩,而使用backside代碼可以輕松完成 特別是在您的情況下,可以簡單地通過掛接到一些事件來完成操作,更重要的是,這不會違反任何MVVM規則,因為您可以在后面的代碼中查看特定內容 因此,我認為從后面的代碼執行ti並沒有什么害處。

在我想將XAML寬松地存儲在某些文本文件中並希望在運行時使用XamlReader.Load()加載該文件的情況下,我通常會首選XAML解決方案。

正如我提到的那樣,動畫比Dependency屬性的本地值設置器具有更高的優先級。 因此,一旦TextChanged事件得到提高的值,就將其設置為true,並且后面的代碼對該屬性進行的任何進一步更改都將無效。

但是,無論如何,您都可以通過動畫設置將其從代碼的后面更改(​​將在此處發布只是為了完整回答,可能會幫助那些偶然發現此帖子的人)。 這是從后面的代碼中執行的方法:

private void Button_BackUpSave_Click(object sender, RoutedEventArgs e)
{
   EnableDisableBackUpSaveButton(false);
}

private void EnableDisableBackUpSaveButton(bool value)
{
   BooleanAnimationUsingKeyFrames animation = 
                              new BooleanAnimationUsingKeyFrames();
   DiscreteBooleanKeyFrame keyFrame = new DiscreteBooleanKeyFrame(value, 
                           KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(0)));
   animation.KeyFrames.Add(keyFrame);
   BackUpSave.BeginAnimation(Button.IsEnabledProperty, animation);
}

現在,在XAML中,您只能在TextChanged上使用單個XAML觸發器。

您可以使用數據觸發器:

<TextBox Name="BackUpTextBox" />
    <Button  Name="BackUpSave" Content="Save">
        <Button.Style>
            <Style TargetType="{x:Type Button}">
                <Setter Property="IsEnabled" Value="True" />
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=BackUpTextBox, Path=Text, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" Value="{x:Null}">
                        <Setter Property="IsEnabled" Value="False" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding ElementName=BackUpTextBox, Path=Text, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" Value="">
                        <Setter Property="IsEnabled" Value="False" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>

在真實的應用程序中,盡管您不會在XAML中執行此操作,因為無法在單元測試中測試此行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM