为什么OneWayToSource绑定会覆盖数据触发器?

尼尔·T

我有一个带有多个控件的WPF表单,并且我希望在且仅当那些控件上的各种条件为真时才启用按钮(“分配”)。一些条件包括测试文本框是否为空。

我最初是通过将文本框的内容绑定到属性并IsEnabled在XAML中绑定按钮属性来实现的:

<TextBox Name="NewName" Text="{Binding NewName}" />
(etc)

<Button Name="Assign" ... IsEnabled="{Binding Path=AssignEnabled}" />

在C#ViewModel中使用相应的方法:

public bool AssignEnabled
{
    get
    {
        return !string.IsNullOrWhiteSpace(this.NewName) && ... (etc)
    }

    set
    {
        ...
        this.NotifyPropertyChanged("AssignEnabled");
        ...
    }
}

问题是,这导致按钮在相应文本框中失去焦点时更新,而不是在更改文本时更新。我本可以使用TextChangedXAML中每个文本框属性来调用代码,但这似乎过于复杂了。

为了解决这个问题,我删除了绑定,并切换到DataTriggers,如下所示:

<Button Name="Assign" ... >
    <Button.Style>
        <Style TargetType="Button">
            <Setter Property="IsEnabled" Value="True"/>
            <Style.Triggers>
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Binding="{Binding IsChecked, ElementName=NewNameOption}" Value="true" />
                        <Condition Binding="{Binding Text, ElementName=NewName}" Value="{x:Static sys:String.Empty}" />
                    </MultiDataTrigger.Conditions>
                    <Setter Property="IsEnabled" Value="False"/>
                </MultiDataTrigger>
                ...
                (more conditions here)
                ...
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

这绝对好用。唯一的缺点是我以前编写的用于测试IsEnabled按钮状态的单元测试不再可用(因为它们使用AssignEnabled的ViewModel属性不再绑定到按钮)。

为了使这些单元测试能够正常工作,我需要该AssignEnabled属性来反映IsEnabled按钮状态。我希望能够通过添加OneWayToSource绑定来解决此问题,如下所示:

<Button Name="Assign" ... IsEnabled="{Binding AssignEnabled, Mode=OneWayToSource}">

将属性更改为:

public bool AssignEnabled { get; set; }

但是,即使将绑定设置为OneWayToSource该绑定似乎仍会覆盖DataTriggers,因为启用/禁用按钮根本不再起作用。

我知道还有其他选择,例如使用Converter或Implementing ICommand,但我希望尽可能保持简单并修复上述方法(或至少了解为什么它不起作用)。如何IsEnabled在不违反ViewModel范例或防止DataTriggers正常工作的情况下访问按钮属性?

德米特里

您可以保留第一个解决方案并设置UpdateSourceTrigger=PropertyChanged绑定。这样,绑定将在文本更改时立即更改,而不仅是在失去焦点时。顺便说一下,此解决方案为您提供了更灵活的选择,因为您可以在自己的字段上执行更复杂的测试(例如,测试电子邮件地址格式)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么触发器伪记录是触发器主体中绑定变量的占位符,而不是 WHEN?

来自分类Dev

为什么在触发了代替触发器后无法插入或更新有效数据?

来自分类Dev

为什么在双击 Entry 小部件时 Python 的 Tkinter 中的 <<ListboxSelect>> 绑定会虚假触发?

来自分类Dev

为什么动态绑定会影响未来?

来自分类Dev

为什么与转换器绑定会更改GUI上未绑定的属性?

来自分类Dev

DocumentDB为什么无法从Azure门户触发触发器?

来自分类Dev

RelativeSource数据触发器绑定不起作用

来自分类Dev

Wpf ToggleButton命令绑定数据触发器

来自分类Dev

触发器为什么不更新Oracle数据库中的列值?

来自分类Dev

为什么要返回触发器(“点击”)?

来自分类Dev

为什么无法在onOpen触发器中调用UrlFetchApp?

来自分类Dev

为什么无法保存mySQL触发器?

来自分类Dev

为什么触发器“而不是删除”不是递归的?

来自分类Dev

为什么视图不支持AFTER触发器?

来自分类Dev

为什么变量触发器引发异常?

来自分类Dev

即使在触发器声明中指定了 [AFTER],为什么我的触发器在插入行之前被触发?

来自分类Dev

为什么mysqli参数绑定会给出错误?

来自分类Dev

WPF开关与触发器绑定

来自分类Dev

WPF 数据触发器未触发

来自分类Dev

为什么HTML标签包含div两次触发触发器回调?

来自分类Dev

为什么触发器触发时我的故事板动作被跳过

来自分类Dev

WPF文本框未使用数据绑定,iNotifyPropertyChanged和PropertyChanged触发器更新

来自分类Dev

如何为事件触发器设置绑定数据的动画?

来自分类Dev

使用数据绑定,触发器和命令的任何理由-C#和WPF

来自分类Dev

为什么不在Firebase云功能模拟器上调用firestore onWrite触发器?

来自分类Dev

为什么在QTreeView中进行编辑是由除我已启用的触发器之外的其他触发器触发的?

来自分类Dev

jQuery在回调上绑定会自行触发

来自分类Dev

数据表插入触发器

来自分类Dev

在触发器内检索数据

Related 相关文章

  1. 1

    为什么触发器伪记录是触发器主体中绑定变量的占位符,而不是 WHEN?

  2. 2

    为什么在触发了代替触发器后无法插入或更新有效数据?

  3. 3

    为什么在双击 Entry 小部件时 Python 的 Tkinter 中的 <<ListboxSelect>> 绑定会虚假触发?

  4. 4

    为什么动态绑定会影响未来?

  5. 5

    为什么与转换器绑定会更改GUI上未绑定的属性?

  6. 6

    DocumentDB为什么无法从Azure门户触发触发器?

  7. 7

    RelativeSource数据触发器绑定不起作用

  8. 8

    Wpf ToggleButton命令绑定数据触发器

  9. 9

    触发器为什么不更新Oracle数据库中的列值?

  10. 10

    为什么要返回触发器(“点击”)?

  11. 11

    为什么无法在onOpen触发器中调用UrlFetchApp?

  12. 12

    为什么无法保存mySQL触发器?

  13. 13

    为什么触发器“而不是删除”不是递归的?

  14. 14

    为什么视图不支持AFTER触发器?

  15. 15

    为什么变量触发器引发异常?

  16. 16

    即使在触发器声明中指定了 [AFTER],为什么我的触发器在插入行之前被触发?

  17. 17

    为什么mysqli参数绑定会给出错误?

  18. 18

    WPF开关与触发器绑定

  19. 19

    WPF 数据触发器未触发

  20. 20

    为什么HTML标签包含div两次触发触发器回调?

  21. 21

    为什么触发器触发时我的故事板动作被跳过

  22. 22

    WPF文本框未使用数据绑定,iNotifyPropertyChanged和PropertyChanged触发器更新

  23. 23

    如何为事件触发器设置绑定数据的动画?

  24. 24

    使用数据绑定,触发器和命令的任何理由-C#和WPF

  25. 25

    为什么不在Firebase云功能模拟器上调用firestore onWrite触发器?

  26. 26

    为什么在QTreeView中进行编辑是由除我已启用的触发器之外的其他触发器触发的?

  27. 27

    jQuery在回调上绑定会自行触发

  28. 28

    数据表插入触发器

  29. 29

    在触发器内检索数据

热门标签

归档