C# ';文本';属性不能从属性触发器设置并显示在触发器';同时,它的状况如何

C# ';文本';属性不能从属性触发器设置并显示在触发器';同时,它的状况如何,c#,wpf,xaml,mvvm,wpf-style,C#,Wpf,Xaml,Mvvm,Wpf Style,我想使用触发器将文本“0”替换为“”。。但是得到下面的编译错误 无法从属性触发器设置“Text”属性,并同时显示在触发器的条件中 <TextBox MaxLength="10"> <TextBox.Style TargetType="{x:Type TextBox}" x:Key="d1"> <Style.Triggers> <Trigger Property="Text" Value="0">

我想使用触发器将文本“0”替换为“”。。但是得到下面的编译错误

无法从属性触发器设置“Text”属性,并同时显示在触发器的条件中

<TextBox MaxLength="10">
    <TextBox.Style TargetType="{x:Type TextBox}" x:Key="d1">
        <Style.Triggers>
            <Trigger Property="Text" Value="0">
                <Setter Property="Text" Value="" />
            </Trigger>
        </Style.Triggers>
    </TextBox.Style>
</TextBox>

错误消息清楚地告诉您,您不能这样做。设置的属性与触发的属性相同

一些选择包括:

  • 如果
    文本框
    绑定到源属性,则可以使用转换器将字符串“0”转换为
    字符串。空

  • 如果
    Text
    属性绑定到
    string
    属性,则只需返回
    string.Empty
    ,而不是从该属性返回“0”

  • 如果它是
    int
    属性,则可以将其类型更改为
    int?
    ,并返回
    null
    ,而不是
    0

  • 如果
    Text
    属性没有数据绑定,您可以处理
    TextChanged
    事件,如下所示:

    private bool _handle = true;
    private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        if (_handle)
        {
            _handle = false;
            TextBox textBox = sender as TextBox;
            if (textBox.Text == "0")
                textBox.Text = string.Empty;
            _handle = true;
        }
    }
    

因此,您有很多选择,但使用触发器不是其中之一。

错误消息清楚地告诉您,您不能这样做。设置的属性与触发的属性相同

一些选择包括:

  • 如果
    文本框
    绑定到源属性,则可以使用转换器将字符串“0”转换为
    字符串。空

  • 如果
    Text
    属性绑定到
    string
    属性,则只需返回
    string.Empty
    ,而不是从该属性返回“0”

  • 如果它是
    int
    属性,则可以将其类型更改为
    int?
    ,并返回
    null
    ,而不是
    0

  • 如果
    Text
    属性没有数据绑定,您可以处理
    TextChanged
    事件,如下所示:

    private bool _handle = true;
    private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        if (_handle)
        {
            _handle = false;
            TextBox textBox = sender as TextBox;
            if (textBox.Text == "0")
                textBox.Text = string.Empty;
            _handle = true;
        }
    }
    

因此,您有很多选择,但使用触发器不是其中之一。

错误消息对我来说非常清楚,而且合理。WPF不希望您设置一个无限循环,在这种情况下可能会发生这种情况。一旦触发器不再应用(因为setter更改了值),WPF将恢复到绑定值,假设存在一个绑定值,这可能会再次触发触发器,从而导致触发器不再应用,依此类推。在你的问题中没有足够的上下文来了解更广泛的目标是什么,但很明显你只是在错误地思考你的问题。解决这个问题,确保包括一个好的和更好的解释。错误信息对我来说似乎非常清楚,合理。WPF不希望您设置一个无限循环,在这种情况下可能会发生这种情况。一旦触发器不再应用(因为setter更改了值),WPF将恢复到绑定值,假设存在一个绑定值,这可能会再次触发触发器,从而导致触发器不再应用,依此类推。在你的问题中没有足够的上下文来了解更广泛的目标是什么,但很明显你只是在错误地思考你的问题。解决问题,确保包括一个好的,并更好地解释。