Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么OneWayToSource绑定会覆盖数据触发器?_C#_Wpf_Xaml_Data Binding_Datatrigger - Fatal编程技术网

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

C# 为什么OneWayToSource绑定会覆盖数据触发器?,c#,wpf,xaml,data-binding,datatrigger,C#,Wpf,Xaml,Data Binding,Datatrigger,我有一个带有多个控件的WPF表单,我希望当且仅当这些控件上的各种条件为真时才启用按钮(“分配”)。一些条件包括测试文本框是否为空 我最初是通过将文本框的内容绑定到属性并绑定XAML中按钮的IsEnabled属性来实现的: <TextBox Name="NewName" Text="{Binding NewName}" /> (etc) <Button Name="Assign" ... IsEnabled="{Binding Path=AssignEnabled}" />

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

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

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

<Button Name="Assign" ... IsEnabled="{Binding Path=AssignEnabled}" />
问题在于,这会导致在各个文本框的焦点丢失时更新按钮,而不是在文本更改时更新按钮。我本可以在XAML中的每个文本框上使用
TextChanged
属性来调用代码,但这似乎过于复杂了

为了解决这个问题,我删除了绑定并切换到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>
<Button Name="Assign" ... IsEnabled="{Binding AssignEnabled, Mode=OneWayToSource}">
属性更改为:

public bool AssignEnabled { get; set; }
但是,由于按钮的启用/禁用不再有效,因此,即使将此绑定设置为
OneWayToSource
,它似乎也会覆盖数据触发器


我知道还有其他选择,比如使用转换器或实现
ICommand
,但如果可能的话,我更愿意保持这种简单,并修复上述方法(或者至少理解为什么它不起作用)。如何访问按钮的
IsEnabled
属性而不违反ViewModel范式或阻止DataTriggers工作?

您可以保留第一个解决方案,并为绑定设置
UpdateSourceTrigger=PropertyChanged
。这样,当文本更改时,绑定将立即更改,而不仅仅是当焦点丢失时。另外,此解决方案为您提供了更大的灵活性,因为您可以对字段执行更复杂的测试(例如,测试电子邮件地址格式)。

您可以保留第一个解决方案,并为绑定设置
UpdateSourceTrigger=PropertyChanged
。这样,当文本更改时,绑定将立即更改。UpdateSourceTrigger=PropertyChanged有什么过于复杂的地方?似乎不使用UpdateSourceTrigger=PropertyChanged是使问题复杂化的原因。@Didier,谢谢。如果你加上这个作为答案,我会把它标记为正确的。谢谢你,这就是我错过的。
public bool AssignEnabled { get; set; }