通过XAML在WPF中的TextBox的TextChanged事件上启用/禁用Button

WPF中有TextBox和Button控件:

 

如果更改了BackUpTextBox的文本,则必须启用Button BackUpSave。 我知道如何通过C#代码通过BackUpTextBox TextChanged事件来做到这一点。 但有没有办法通过XAML表示法启用/禁用按钮?

您可以通过EventTrigger实现这一目标。 在StackPanel包装两个控件,以便TextChanged 事件路由到其父StackPanel

在这种情况下,通过将IsEnabled设置为True来启用Button。

                                  

UPDATE

如果您想要再次单击按钮上的按钮,请Button.Click添加另一个事件处理程序,并将其设置为禁用。 我更新了xaml代码。


更新2

解决方案看起来很麻烦,我很怀疑它是否值得与只在Initial,TextChanged和Click事件中设置IsEnabled属性相比。 我错过了这些日子XAML风格更优选的东西吗?

是的,我必须同意XAML只有解决方案有时很麻烦,可以使用后面的代码轻松完成 。 特别是在你的情况下,它可以简单地通过挂钩到一些事件来完成,更重要的是,它不会违反任何MVVM规则,因为你在后面的代码中查看特定的东西 。 所以,我认为从代码背后做ti是没有害处的。

XAML只有我想要的解决方案,我希望将我的XAML松散地存储在某个文本文件中,并希望在运行时使用XamlReader.Load()加载它

正如我所提到的,动画的优先级高于Dependency属性的本地值setter。 因此,一旦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触发器。

您可以使用数据触发器:

   

在实际应用程序中虽然您不会在XAML中执行此操作,因为在unit testing中无法测试此行为。