繁体   English   中英

WPF样式触发器仅触发一次

[英]Wpf Style Trigger triggered only once

我在网格上添加了一个属性触发器,如下所示

<Grid.Style>
    <Style TargetType="{x:Type Grid}">
        <Style.Triggers>
          <Trigger Property="IsMouseOver" Value="False">
                <Setter Property="ToolTip" Value=""></Setter>
            </Trigger>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="ToolTip" Value="{Binding StoredValue}"></Setter>
            </Trigger>
        </Style.Triggers>
    </Style>
</Grid.Style>

当我将鼠标悬停在网格上时,该属性仅触发一次。 我需要的是,每次MouseHover发生时,都必须调用该属性的( StoredValue )getter。

请帮忙

如果您真的想在每次显示时更新工具提示,则可以利用ToolTipOpening事件刷新绑定:

<Grid x:Name="grid1" Background="Transparent">
    <Grid.Style>
        <Style TargetType="Grid">
            <Setter Property="ToolTip" Value="{Binding StoredValue,TargetNullValue=''}"/>
            <EventSetter Event="ToolTipOpening" Handler="grid1_ToolTipOpening"/>
        </Style>
    </Grid.Style>
</Grid>

在下面的代码中更新绑定:

private void grid1_ToolTipOpening(object sender, ToolTipEventArgs e)
{
    var s = sender as FrameworkElement;
    var be = BindingOperations.GetBindingExpressionBase(s, FrameworkElement.ToolTipProperty);
    if (be != null)
    {
        be.UpdateTarget();
    }
}

注意:如果StoredValue有时会返回null则需要TargetNullValue='' 否则,工具提示将不会尝试打开,因此将永远不会发生ToolTipOpening ,并且该值永远不会从null更新为新值。

虽然我无法解释问题的本质,但是这里有一个快速的解决方法:手动发出通知,然后绑定会刷新自身。 您将触发事件换成事件:

<Grid Background="Transparent" MouseEnter="Grid_MouseEnter">
    <Grid.Style>
        <Style TargetType="{x:Type Grid}">
            <!-- normal binding, this line is comment and should be gray -->
            <Setter Property="ToolTip" Value="{Binding StoredValue}" />
        </Style>
    </Grid.Style>
</Grid>


public partial class MainWindow : Window, INotifyPropertyChanged
{
    public string StoredValue => "123"; // is called every time mouse is entered

    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
    }

    public event PropertyChangedEventHandler PropertyChanged;

    // rise notification manually
    void Grid_MouseEnter(object sender, MouseEventArgs e) =>
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(StoredValue)));

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM