WPF公司|MultiDataTrigger与绑定到同一属性

f0brbegy  于 2022-11-18  发布在  其他
关注(0)|答案(1)|浏览(229)

我正在处理下一个任务。有一些类和枚举:

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,按钮仍应被禁用。如何解决此问题?

lvjbypge

lvjbypge1#

没有一个可以在我的电脑上运行的例子,我很难说清楚为什么,但有几个明显的错误。
1.如果您设定属性值(直接或透过系结),则该值会优先于Style的值。在您的情况下,这表示会忽略样式触发程序。
1.由于可能会发生绑定错误,因此需要设置返回值以防发生此类错误。
1.在Condition中,您需要指定的不是Property,而是Binding
下面是一个可能解决您的问题的实现:

<Button>
    <Button.Style>
        <Style TargetType="Button">
            <Setter Property="IsEnabled" Value="False"/>
            <Style.Triggers>
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Binding="{Binding Status, FallbackValue=Failed}" Value="Completed"/>
                        <Condition Binding="{Binding IsActive, Mode=OneWay, UpdateSourceTrigger=PropertyChanged, FallbackValue=True}" Value="False"/>
                    </MultiDataTrigger.Conditions>
                    <Setter Property="IsEnabled" Value="True"/>
                </MultiDataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

**P.S.**在WPF中,这类问题的典型解决方案是在按钮中使用命令,并处理依赖项以在命令的CanExecute方法中启用按钮。

但当我按下按钮并以编程方式设置Button.IsEnabled =false时,SET中的断点对IsActive属性不起作用。
第一个
风格和触发器是不需要的,它们只能提供单向的交流。

相关问题