【问题标题】:MultiDataTrigger Not firing once the button isEnabled property is changed from code behindMultiDataTrigger 一旦按钮 isEnabled 属性从后面的代码更改,就不会触发
【发布时间】:2015-08-05 05:04:48
【问题描述】:

我有一个基于几个文本框的validation.hasError 属性启用/禁用的按钮,它工作正常,直到我想根据一些业务逻辑从代码中禁用和启用这个相同的按钮。例如。

if(recordExist) { btn.IsEnabled=true;} else{ btn.isenabled=false;}

现在发生的情况是,一旦执行 else 逻辑并且禁用按钮,即使所有控件的 validation.HasError 返回 false,按钮也不会再次重新启用。同样,如果执行if 逻辑并启用按钮,即使validation.hasError 返回true,它也会保持启用状态。我想要的是以某种方式重新触发multiDataTriggers 以检查textboxes 上的Validation.hasError 并相应地更新按钮的isEnabled 属性。我希望我足够清楚。

【问题讨论】:

    标签: c# wpf validation xaml multidatatrigger


    【解决方案1】:

    请参阅 MSDN 上的 Dependency Property Value Precedence

    一旦您设置了本地值,触发器就无法覆盖它。您需要调整绑定、触发器等以考虑后面代码中的逻辑。如果您正在使用 MVVM(并且应该),您可以将条件添加到您的视图模型中。

    或者,如果您希望控件忘记本地值并让触发器优先,您可以使用ClearValue。或者您可以使用SetCurrentValue 并避免优先考虑新值。但是,您应该避免使用这些函数,它们会使您的代码更难理解和维护。

    【讨论】:

    • 我认为通过使用SetCurrentValue 方法添加一个可以实际设置依赖属性的值并维护它的当前数据源(绑定等)会很有用。在 OP 的情况下,可以通过调用 btn.SetCurrentValue(Button.IsEnabledProperty, true /*or false*/) 来实现。
    • @Grx70 你是对的。更新了我的答案。但是,我认为ClearValueSetCurrentValue 等永远不应该用于处理这样的逻辑。它看起来像一个黑客。这些函数有很好的用途,但事实并非如此。
    • 感谢大家的回复,但正如我上面提到的,我使用style.triggersMultiDataTrigger 来处理按钮的启用和禁用,并且Isenabled 属性未设置在按钮标签内xml。我试过setCurrentValue 它根本不起作用,它不会改变属性。我不太明白ClearValue 选项,你能举个例子吗?
    • @FaisalMalikyar 不要使用这些函数。只需在您的视图模型中创建一个属性IsButtonFooEnabled 并绑定到它。不要仅仅为了启用和禁用控件而使用代码隐藏,它很脆弱且无法维护。
    • @Discord 我正在使用 ValidationRules 进行验证,所以您能否提供一个属性示例 IsButtonFooEnabled 我应该把它放在哪里以及如何将它绑定到按钮的 isEnabled 属性。?跨度>
    猜你喜欢
    • 2013-09-25
    • 1970-01-01
    • 2012-12-26
    • 2018-10-29
    • 2019-12-21
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多