2012-08-28 26 views
0

我有兩個控件包含在數據模板中。控制#1是稱爲「TXTBLOCK」的TextBlock。控制#2是一個名爲「TXTBOX」的文本框:通過數據綁定和值轉換器的兩個控件的可見性

TXTBLOCK將可見性設置爲文本框可見性,使用轉換器給出相反的值。

例子:

<TextBlock Name="TXTBLOCK" Visibility="{Binding ElementName=**TXTBOX**, Path=Visibility, Converter={StaticResource toggleVisConverter}}" /> 

<TextBox Name="TXTBOX" Visibility="{Binding ElementName=**TXTBLOCK**, Path=Visibility, Converter={StaticResource toggleVisConverter}}" /> 

Converter是:

 if (targetType == typeof(Visibility)) 
     { 
      Visibility vis = (Visibility)value; 
      if (vis == Visibility.Collapsed) 
      { 
       return Visibility.Visible; 
      } 
      else 
      { 
       return Visibility.Collapsed; 
      } 
      //var vis == Visibility.Collapsed ? Visibility.Visible : Visibility.Collapsed; 
     } 

     //return vis; 
     throw new InvalidOperationException("Value must be of type 'Visibility'."); 

現在......對我來說,這應該是簡單的。更改一個人的可見性會將另一個人的可見性設置爲false。

不是這樣的......

通過作品的第一次,然後轉換停止被調用。

即使我在代碼後面明確聲明:「TXTBOX.Visibility = Visibility.Hidden」,轉換器也不會被調用。

什麼給?我錯過了什麼?

這是我在SO上的第一篇文章...如果我錯過了某些東西或需要提供更多信息,請原諒我。我會很樂意去做

謝謝!

回答

0

看來WPF有檢測和避免數據綁定中堆棧溢出的方法。 I'm aware of one,似乎你找到了另一個。

當你改變你的控件之一的知名度,類似下面的情況(理論上至少):

  • 您更改TextBlock的(說)的知名度,
  • 這個原因在文本框的視覺辨認性的變化,
  • 然後,這導致在TextBlock的能見度另一個變化,
  • 這導致TextBlock的能見度另一個變化,使用第一結合再次,
  • ...

這將永遠持續下去,很可能會導致堆棧溢出,如果它不是爲WPF自動檢測到這種情況。在這種情況下,它似乎會停止監聽您創建的綁定,一旦它檢測到它可能會導致堆棧溢出。

我還沒有運行你的代碼,但我懷疑WPF並沒有通知你這件事。我猜測沒有例外,警告,甚至沒有寫入輸出窗口的調試行。

看起來這對綁定是這裏的問題。我建議你做的是:

  • 通過實施ConvertBack方法使您的ValueConverter成爲雙向轉換器。(如果你的所有轉換器正在做的是CollapsedVisible之間的交換,ConvertBack可能只需撥打Convert。)
  • 充分利用綁定一個加入Mode=TwoWay(這並不重要的一個)雙向,並刪除其他捆綁。一個TwoWay綁定將足以在兩個控件之間的雙向通信。

編輯:我的評論有關ConvertBack是你如下能夠實現:

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    return Convert(value, targetType, parameter, culture); 
} 

這是因爲所有的轉換器正在做的是VisibleCollapsed之間的交換和轉換一個方式是和轉換回來一樣。這個評論基本上是旁白的;你當然可以按你的意願實現ConvertBack,但是如果你在TwoWay綁定中使用你的轉換器,你需要實現ConvertBack

+0

奇怪我想知道爲什麼我沒有遇到堆棧溢出。我會嘗試你的建議並回復。欣賞迴應 – tronious

+0

盧克再次感謝迴應。我看了一下,我不確定我是否按照你的建議。我已經從文本塊中刪除了綁定。我已經在TextBOX上製作了Binding TwoWay。我不確定我瞭解ConvertBack。你是否真的在說:「轉換(?)」 – tronious

+0

@ user1631520:看到我編輯的答案。 –

相關問題