2017-07-20 80 views
-1

我想用“”使用触发器替换文本“0”。但是得到下面的编译错误。'文本'属性不能从属性触发器中设置,并同时出现在触发器的条件中

'文本'属性不能从属性触发器中设置,并同时出现在触发器的条件中。

<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

这个错误信息对我来说似乎很清楚,而且是合理的。 WPF不希望你引发一个无限循环,在这种情况下会发生什么。一旦触发器不再适用(因为setter更改了值),WPF将恢复到绑定值(假设有一个触发器),这会再次触发触发器,这将导致触发器不再适用,等等。您的问题中没有足够的背景知道更广泛的目标是什么,但显然您只是在考虑错误的问题。解决这个问题,确保包含一个好的[mcve]并更好地解释。 –

回答

2

由于错误信息清楚地告诉你,你不能这样做。这是设置相同的属性,你触发。

一些选项包括:

  • 如果TextBox绑定到源属性,你可以使用一个转换器,将字符串转换为“0”到string.Emptyhttps://www.codeproject.com/Tips/868163/IValueConverter-Example-and-Usage-in-WPF

  • 如果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; 
        } 
    } 
    

所以你有很多选择,但使用触发器是不是其中之一。