我怎么能知道即使属性未更改也为什么WPF DataTrigger会触发?

问题描述

我的问题似乎与其他所有人的问题相反。我的WPF DataTrigger有时会触发 ,即使与其绑定的viewmodel属性没有更改 。我已将日志记录代码放在属性本身中,以确保它没有更改。

是否有一些简单的方法可以确定为什么要触发动画?我可以订阅一些事件,让我在自己的代码中放置一个断点,并在动画触发时查看调用堆栈吗?

这是情节提要。只需在1秒钟内将0到1的两倍动画。双人间将存储在FrameworkElement.Tag

<Storyboard x:Key="TagZeroToOne" x:Shared="False">
    <DoubleAnimation Storyboard.TargetProperty="Tag" From="0" To="1" Duration="0:0:1.0" />
</Storyboard>

这是在DataTrigger中使用它的样式的相关部分。 (我省略了项目模板和面板)

<!-- Style for ItemsControl that draws circular handles when ShapeVm is selected -->

<Style x:Key="ShapeHandlesItemsControlStyle" targettype="{x:Type ItemsControl}">

    <d:Style.DataContext>
        <x:Type Type="gci:ShapeVm" />
    </d:Style.DataContext>

    <!-- Default style value of ItemsControl.Tag" property is 1.0 -->

    <Setter Property="Tag">
        <Setter.Value>
            <sys:Double>1.0</sys:Double>
        </Setter.Value>
    </Setter>

    <!--
    We cannot animate Opacity directly because its max value depends upon
    a binding but we be we can make it be dependent upon another property
    "Tag" that we *do* animate.  This requires a Math Converter as well
    Picked up this technique from the following SO question

    https://stackoverflow.com/questions/2186933/wpf-animation-binding-to-the-to-attribute-of-storyboard-animation/14164245#14164245

    -->
    <Setter Property="Opacity">
        <Setter.Value>
            <MultiBinding Converter="{StaticResource CvtMath}" 
                          ConverterParameter="1.0 - (x *(1.0-y))">            <!--  Calculation  -->
                <Binding Path="Tag" RelativeSource="{RelativeSource Self}" /> <!--  Animated operand (0.0 to 1.0)  -->
                <Binding ElementName="Root" Path="ShapeHandleOpacity" />      <!--  Configured opacity operand  -->
            </MultiBinding>
        </Setter.Value>
    </Setter>



    <!-- When ShapeVm.IsSelected becomes true,animate the ItemsControl.Tag from 0 to 1.0 -->

    <Style.Triggers>

        <DataTrigger Binding="{Binding IsSelected}" Value="True">
            <DataTrigger.Enteractions>
                <BeginStoryboard Storyboard="{StaticResource TagZeroToOne}" />
            </DataTrigger.Enteractions>
        </DataTrigger>

    </Style.Triggers>

这个想法是,当用户第一次选择形状时,我的后台代码将其IsSelected属性设置为“ true”。这使动画着火了,我看到了与动画有关的视觉效果。但这应该就是这样。

相反,似乎几乎每隔一次我单击相关对象,动画就会触发,并且看到效果。但是,我已通过日志记录和断点(反复)验证了IsSelected属性此后再也不会更改。没有人设置它。没有人为此触发PropertyChanged通知,据我所知,甚至没有人触发PropertyChanged(null)。

这是ShapeVm.IsSelected属性

private bool _isSelected;
public bool IsSelected
{
    get => _isSelected;
    set
    {
        if (value == _isSelected)
            return;

        _isSelected = value;
        Debug.WriteLine($"Shape selected change to {value}");
    }
}

那么我如何确定WPF为何触发此触发器?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)