Используйте поведение в стиле

У меня есть поведение, как я могу использовать его в стиле TextBlock, чтобы он применялся ко всем TextBlocks.

<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";
        }
    }
}

1 ответ

Решение

Есть два основных способа реализации поведения в WPF, обычно называемые прикрепленным поведением и смешанным поведением.

Прикрепленное поведение - это просто прикрепленное свойство с PropertyChangedCallback прикрепленный к нему обработчик изменений, который выполняет какое-либо действие или расширяет DependencyObject к которому он прикреплен, когда значение свойства зависимости изменяется.

Вы обычно определяете присоединенное поведение как статический класс с набором статических методов, которые получают и устанавливают значение свойства зависимости и выполняют желаемую логику в результате вызываемого обратного вызова. Вы можете легко установить значение любого такого свойства в стиле:

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

Поведение Blend обеспечивает лучший способ инкапсулировать функциональность поведения по сравнению с обычным присоединенным поведением. Они также более удобны для разработки, поскольку их можно легко прикрепить к визуальным элементам в пользовательском интерфейсе с помощью функции перетаскивания в Blend. Но я боюсь, что вы не можете добавить поведение Blend к Style сеттер:

Как добавить Blend Behavior в Style Setter

Так что, если вы хотите иметь возможность применять свое поведение в контексте Style, вы должны написать прикрепленное поведение вместо поведения Blend.

Изменить: ваше поведение является смешанным поведением. Замените его прикрепленным поведением:

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>
Другие вопросы по тегам