我正在尝试在WPF中创建一个可重复使用的文本块用户控件。基本思想如下:
- 用户未直接指定文本块的内容
- 我的用户控件中有三个依赖性属性,称为
IsToggled
,ToggleTrueText
和ToggleFalseText
。 - 如果
IsToggled
为true,则控件将显示ToggleTrueText
;或显示ToggleFalseText
如果IsToggled
是错误的。 - 当
IsToggled
在运行时发生变化时,文本会自动更改为ToggleTrueText
或ToggleFalseText
我首先将PropertyChangedCallback
添加到IsToggled
DP:
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
在运行时更改其文本的最佳方法。
尝试以下:
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>
您可以为此使用触发器请检查下面的代码
<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>