Используйте поведение в стиле
У меня есть поведение, как я могу использовать его в стиле 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>