使用风格的行为

Use behavior in style

我有一个行为,如何在 TextBlock 样式中使用它,以便它应用于所有 TextBlock。

<TextBlock Grid.Row="0"  Grid.Column="1" Text="{Binding Distance}" >
        <i:Interaction.Behaviors>
            <Behaviors:EmptyToNaBehaviour/>
        </i:Interaction.Behaviors>
</TextBlock>

这是我的附加行为,基本上是将空值更改为 N/A

 public class EmptyToNaBehaviour : Behavior<TextBlock>
{
    protected override void OnAttached()
    {
        var txtblock = this.AssociatedObject as TextBlock;

        if (txtblock != null && string.IsNullOrEmpty(txtblock.Text))
        {
            txtblock.Text = "N/A";
        }
    }
}

WPF 中基本上有两种不同的行为实现方式,通常称为附加行为和混合行为。

附加行为只是附加的 属性 和附加的 PropertyChangedCallback 更改处理程序,当值依赖关系 属性 发生变化。

您通常将附加行为定义为静态 class,并使用一组静态方法来获取和设置依赖项的值 属性 并作为回调的结果执行所需的逻辑被调用。您可以轻松地在样式中设置任何此类属性的值:

<Setter Property="local:EmptyToNaBehaviour.SomeProperty" Value="x"/>

与普通的附加行为相比,Blend 行为提供了一种更好的封装行为功能的方法。它们也更容易设计友好,因为它们可以通过 Blend 中的拖放功能轻松附加到 UI 中的视觉元素。但恐怕你无法真正将 Blend 行为添加到 Style setter:

How to add a Blend Behavior in a Style Setter

因此,如果您希望能够在 Style 的上下文中应用您的行为,您应该编写附加行为而不是混合行为。

编辑: 您的行为是混合行为。将其替换为附加行为:

public class EmptyToNaBehaviour
{
    public static string GetText(TextBlock textBlock)
    {
        return (string)textBlock.GetValue(IsBroughtIntoViewWhenSelectedProperty);
    }

    public static void SetText(TextBlock textBlock, string value)
    {
        textBlock.SetValue(IsBroughtIntoViewWhenSelectedProperty, value);
    }

    public static readonly DependencyProperty IsBroughtIntoViewWhenSelectedProperty =
        DependencyProperty.RegisterAttached(
        "Text",
        typeof(string),
        typeof(EmptyToNaBehaviour),
        new UIPropertyMetadata(null, OnTextChanged));

    private static void OnTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        TextBlock txtblock = d as TextBlock;
        if(txtblock != null)
            txtblock.Loaded += Txtblock_Loaded;
    }

    private static void Txtblock_Loaded(object sender, RoutedEventArgs e)
    {
        TextBlock txtblock = sender as TextBlock;
        string text = GetText(txtblock);
        if (txtblock != null && !string.IsNullOrEmpty(text) && string.IsNullOrEmpty(txtblock.Text))
        {
            txtblock.Text = text;
        }
    }
}

用法:

<TextBlock Grid.Row="0"  Grid.Column="1" Text="text"
           Behaviors:EmptyToNaBehaviour.Text="N/A">
</TextBlock>

或风格:

<Style x:Key="style" TargetType="TextBlock">
    <Setter Property="Behaviors:EmptyToNaBehaviour.Text" Value="N/A" />
</Style>