在WPF中创建一个自我更新的文本块用户控件



我正在尝试在WPF中创建一个可重复使用的文本块用户控件。基本思想如下:

  • 用户未直接指定文本块的内容
  • 我的用户控件中有三个依赖性属性,称为IsToggledToggleTrueTextToggleFalseText
  • 如果IsToggled为true,则控件将显示ToggleTrueText;或显示ToggleFalseText如果IsToggled是错误的。
  • IsToggled在运行时发生变化时,文本会自动更改为ToggleTrueTextToggleFalseText

我首先将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;
    }
}

如果要绑定TextBlockText属性,则需要确保您绑定到UserControl的属性。您可以通过设置TextBlockDataContext属性来做到这一点:

<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> 

最新更新