我正在处理下一个任务。有一些类和枚举:
public enum Status
{
Running,
Canceled,
Failed,
Completed
}
public class Result
{
public Status Status { get; set; }
public bool IsActive { get; set; }
}
我有一些UI控件和按钮。这个按钮应该做一些事情:
1.只有在Status == Completed且IsActive = false的情况下才应启用它。
1.当用户按下按钮时,它应该被禁用(并且IsActive应该为true);
1.在某些情况下,Result对象可以为空,因此应禁用该按钮。
为此,我尝试创建具有Status和IsActive的MultiDataTrigger,并将绑定设置为IsActive(对于用户按下按钮的情况-〉我们设置Enabled = false -〉绑定设置IsActive = true)。另外,我发现绑定具有TargetNullValue属性,当Result对象为空时,该属性用于按钮。我对绑定使用Mode=OneWayToSource,因为当我更改IsEnabled属性时,它应该只更改IsActive属性。
<Button IsEnabled="{Binding IsActive, Mode=OneWayToSource, Converter=BooleanInvertedConverter, TargetNullValue = false}">
<Button.Style>
<Style TargetType="Button">
<Setter Property="IsEnabled" Value="False"/>
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Property="{Binding Status}" Value="Status.Completed"/>
<Condition Property="{Binding IsActive, Mode=OneWay, UpdateSourceTrigger=PropertyChanged, TargetNullValue=false}" Value="False"/>
</MultiDataTrigger.Conditions>
<Setter Property="IsEnabled" Value="True"/>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
如果我尝试运行此代码,它会显示异常:
System.NullReferenceException: 'Object reference not set to an instance of an object.'
我想这会发生是因为这时Result对象是null,但我试图通过Binding在他的IsActive属性中设置一些值.如果我去掉Binding而只留下trigger-all工作,按钮会对IsActive和Status属性的初始值作出React.但当我按下按钮时,什么也没有发生,因为没有Binding,而且IsActive没有改变.
因此,当Result对象为空时,此绑定似乎不应尝试设置值。但即使Result对象为空,根据触发器中的TargetNullValue=false,按钮仍应被禁用。如何解决此问题?
1条答案
按热度按时间lvjbypge1#
没有一个可以在我的电脑上运行的例子,我很难说清楚为什么,但有几个明显的错误。
1.如果您设定属性值(直接或透过系结),则该值会优先于Style的值。在您的情况下,这表示会忽略样式触发程序。
1.由于可能会发生绑定错误,因此需要设置返回值以防发生此类错误。
1.在
Condition
中,您需要指定的不是Property
,而是Binding
。下面是一个可能解决您的问题的实现:
**P.S.**在WPF中,这类问题的典型解决方案是在按钮中使用命令,并处理依赖项以在命令的CanExecute方法中启用按钮。
但当我按下按钮并以编程方式设置Button.IsEnabled =false时,SET中的断点对IsActive属性不起作用。
第一个
风格和触发器是不需要的,它们只能提供单向的交流。