TextBox.Text的WPF触发器不起作用

时间:2013-07-30 08:11:45

标签: c# wpf xaml

我的用户控件中有一个名为IsPromptShown的依赖项属性:

public static DependencyProperty IsPromptShownProperty = DependencyProperty.
    Register("IsPromptShown", typeof(bool), typeof(AutoCompleteSearchBox), new 
    PropertyMetadata(true));

public bool IsPromptShown
{
    get { return (bool)GetValue(IsPromptShownProperty); }
    set { SetValue(IsPromptShownProperty, value); }
}

该自定义控件包含TextBox。该文本框没有为其Text属性分配任何值:

<TextBox Name="_searchTextBox" Grid.Row="0" VerticalAlignment="Top" 
    GotFocus="SearchTextBox_GotFocus" LostFocus="SearchTextBox_LostFocus" 
    TextChanged="SearchTextBox_TextChanged"/>

现在我在托管窗口中设置以下触发器:

<Trigger Property="IsPromptShown" Value="True">
    <!--<Setter Property="FontStyle" Value="Italic"/>-->
    <Setter Property="TextBox.Text" Value="Seek"/>
</Trigger>

设置FontStyle的注释行有效但设置TextBox.Text的第二行没有。我也一直试图设置Foreground属性,但也失败了。发生了什么事?

3 个答案:

答案 0 :(得分:3)

当我开始使用WPF时,我遇到了类似的问题。你只需要以不同的方式看待事物。不是查看IsPromptShown属性的值并尝试更改TextBoxTriggerUserControl的属性,而是反过来。查看IsPromptShown属性的值,然后尝试更改TextBoxTriggerTextBox的属性。

<TextBox Name="_searchTextBox" Grid.Row="0" VerticalAlignment="Top" 
    GotFocus="SearchTextBox" LostFocus="SearchTextBox_LostFocus" 
    TextChanged="SearchTextBox_TextChanged">
    <TextBox.Style>
        <Style>
            <Setter Property="TextBox.Text" Value="Default value if required" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsPromptShown, ElementName=This}" 
                    Value="True">
                    <Setter Property="TextBox.Text" Value="Seek" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBox.Style>
</TextBox>

请注意,为了实现此目的,您需要在Name=This的声明中添加UserControl。这只是让框架知道在哪里找到IsPromptShown属性...如果您愿意,可以轻松地使用RelativeSource Binding

答案 1 :(得分:1)

我认为问题是您无法从外部访问UserControl中Textbox的TextProperty!

尝试创建Text DependencyProperty,在UserControl中设置Textbox的值,并在Trigger中设置此属性!

答案 2 :(得分:0)

我找到了解决方案。这不是微不足道的,而是有效的。假设我们有一个包含UserControl和ather控件的自定义TextBox。我们希望能够根据某些bool UserControl.IsSomething依赖属性为每个内部控件分配样式。首先,我们必须声明另一个依赖属性Style UserControl.AlternativeStyle。然后我们将事件处理程序附加到IsSomething,以便在Style更改时切换当前AlternativeStyleIsSomething

public static DependencyProperty AlternativeStyleProperty =
    DependencyProperty.Register(
        "AlternativeStyle",
        typeof(Style),
        typeof(MyUserControl));

public Style AlternativeStyle
{
    get { return (Style)GetValue(AlternativeStyleProperty); }
    set { SetValue(AlternativeStyleProperty, value); }
}

public static DependencyProperty IsSomethingProperty =
    DependencyProperty.Register(
        "IsSomething",
        typeof(bool),
        typeof(MyUserControl),
        new PropertyMetadata(true, IsSomethingProperty_Changed));

public bool IsSomething
{
    get { return (bool)GetValue(IsSomethingProperty); }
    set { SetValue(IsSomethingProperty, value); }
}

private static void IsSomethingProperty_Changed(
    DependencyObject d,
    DependencyPropertyChangedEventArgs e)
{
    // Swap styles
    // e.g.
    // var tempStyle = Style;
    // Style = AlternativeStyle;
    // AlternativeStyle = tempStyle;
}

更难的部分是在自定义AlternativeStyle之外设置UserControl。下面是如何在托管我们自定义控件的窗口的XAML中实现它:

<Window.Resources>
    <Style x:Key="DefaultTextBoxStyle" TargetType="TextBox">
        <Setter Property="Background" Value="Red"/>
    </Style>
    <Style x:Key="DefaultUserControlStyle" TargetType="local:MyUserControl">
        <Style.Resources>
            <Style TargetType="TextBox" BasedOn="{StaticResource DefaultTextBoxStyle}">
                <Setter Property="Background" Value="Blue"/>
            </Style>
        </Style.Resources>
    </Style>
    <Style x:Key="AlternativeUserControlStyle" TargetType="local:MyUserControl" BasedOn="{StaticResource DefaultUserControlStyle}">
        <Style.Resources>
            <Style TargetType="TextBox" BasedOn="{StaticResource DefaultTextBoxStyle}">
                <Setter Property="Background" Value="Green"/>
            </Style>
        </Style.Resources>
    </Style>
    <Style TargetType="local:MyUserControl" BasedOn="{StaticResource DefaultUserControlStyle}">
        <Setter Property="AlternativeStyle" Value="{StaticResource AlternativeUserControlStyle}"/>
    </Style>
</Window.Resources>

以上样式将自动添加到MyUserControl的所有实例中,当我们更改IsSomething值时,替代样式将应用于已更改IsSomething的所有者。