在 WPF 中创建自更新的 Textblock 用户控件
Creating a self-updating Textblock user control in WPF
我正在尝试在 WPF 中创建可重复使用的文本块用户控件。基本思路如下:
- 用户没有直接指定文本块的内容
- 我的用户控件中有三个依赖属性,分别是
IsToggled
、ToggleTrueText
和 ToggleFalseText
。
- 如果
IsToggled
为真,控件将显示ToggleTrueText
;如果 IsToggled
为假,则显示 ToggleFalseText
。
- 当
IsToggled
在运行时更改时,文本会自动更改为 ToggleTrueText
或 ToggleFalseText
我首先在 IsToggled
DP 中添加了一个 PropertyChangedCallback
:
UserControl 的代码隐藏:
public static readonly DependencyProperty IsToggledProperty =
DependencyProperty.Register("IsToggled", typeof(bool),
typeof(TagToggle), new PropertyMetadata(new
PropertyChangedCallback(OnToggleStateChanged)));
public bool IsToggled
{
get { return (bool)GetValue(IsToggledProperty); }
set { SetValue(IsToggledProperty, value); }
}
//ToggleTrueText and ToggleFalseText are declared similarly to IsToggled
...
private static void OnToggleStateChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
...
}
Xaml 用户控件:
<Grid x:Name="LayoutRoot">
<TextBlock x:Name="TheTextBlock" Text="{Binding WhatDoIBindTo}"/>
</Grid>
但是,我不确定什么是确保 TheTextBlock
在 IsToggled 在运行时更改时更新其文本的最佳方法。
你可以为此使用触发器
请检查下面的代码
<TextBlock x:Name="TheTextBlock">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsToggled}" Value="True">
<Setter Property="Text" Value="{Binding ToggleTrueText}"/>
</DataTrigger>
<DataTrigger Binding="{Binding IsToggled}" Value="False">
<Setter Property="Text" Value="{Binding ToggleFalseText}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
试试这个:
private static void OnToggleStateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
TagToggle ctrl = d as TagToggle;
if (ctrl != null)
{
TheTextBlock.Text = ctrl.IsToggled ? ToggleTrueText. : ToggleFalseText;
}
}
如果您想绑定 TextBlock
的 Text
属性,您需要确保绑定到 UserControl
的属性。您可以通过设置 TextBlock
:
的 DataContext
属性 来做到这一点
<TextBlock x:Name="TheTextBlock" DataContext="{Binding RelativeSource={RelativeSource AncestorType=UserControl}}">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Text" Value="{Binding ToggleTrueText}" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsToggled}" Value="False">
<Setter Property="Text" Value="{Binding ToggleFalseText}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
我正在尝试在 WPF 中创建可重复使用的文本块用户控件。基本思路如下:
- 用户没有直接指定文本块的内容
- 我的用户控件中有三个依赖属性,分别是
IsToggled
、ToggleTrueText
和ToggleFalseText
。 - 如果
IsToggled
为真,控件将显示ToggleTrueText
;如果IsToggled
为假,则显示ToggleFalseText
。 - 当
IsToggled
在运行时更改时,文本会自动更改为ToggleTrueText
或ToggleFalseText
我首先在 IsToggled
DP 中添加了一个 PropertyChangedCallback
:
UserControl 的代码隐藏:
public static readonly DependencyProperty IsToggledProperty =
DependencyProperty.Register("IsToggled", typeof(bool),
typeof(TagToggle), new PropertyMetadata(new
PropertyChangedCallback(OnToggleStateChanged)));
public bool IsToggled
{
get { return (bool)GetValue(IsToggledProperty); }
set { SetValue(IsToggledProperty, value); }
}
//ToggleTrueText and ToggleFalseText are declared similarly to IsToggled
...
private static void OnToggleStateChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
...
}
Xaml 用户控件:
<Grid x:Name="LayoutRoot">
<TextBlock x:Name="TheTextBlock" Text="{Binding WhatDoIBindTo}"/>
</Grid>
但是,我不确定什么是确保 TheTextBlock
在 IsToggled 在运行时更改时更新其文本的最佳方法。
你可以为此使用触发器 请检查下面的代码
<TextBlock x:Name="TheTextBlock">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsToggled}" Value="True">
<Setter Property="Text" Value="{Binding ToggleTrueText}"/>
</DataTrigger>
<DataTrigger Binding="{Binding IsToggled}" Value="False">
<Setter Property="Text" Value="{Binding ToggleFalseText}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
试试这个:
private static void OnToggleStateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
TagToggle ctrl = d as TagToggle;
if (ctrl != null)
{
TheTextBlock.Text = ctrl.IsToggled ? ToggleTrueText. : ToggleFalseText;
}
}
如果您想绑定 TextBlock
的 Text
属性,您需要确保绑定到 UserControl
的属性。您可以通过设置 TextBlock
:
DataContext
属性 来做到这一点
<TextBlock x:Name="TheTextBlock" DataContext="{Binding RelativeSource={RelativeSource AncestorType=UserControl}}">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Text" Value="{Binding ToggleTrueText}" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsToggled}" Value="False">
<Setter Property="Text" Value="{Binding ToggleFalseText}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>