2017-07-20 82 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; 
        } 
    } 
    

所以你有很多選擇,但使用觸發器是不是其中之一。