[英]Visibility of two controls via data binding and value converter
我有兩個包含在數據模板中的控件。 控件1是一個文本塊,稱為“ TXTBLOCK”。 控件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}}" />
轉換器是:
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的第一篇文章...因此,如果我錯過了某些事情或需要提供更多信息,請原諒我。 我很樂意做
謝謝!
似乎WPF具有檢測和避免數據綁定中堆棧溢出的方法。 我知道一個 ,看來您找到了另一個。
當您更改其中一個控件的可見性時,會發生類似以下的事情(至少在理論上是這樣):
如果不是WPF自動檢測這種情況,這將永遠持續下去,並且很可能導致堆棧溢出。 在這種情況下,一旦檢測到它可能正在向堆棧溢出邁進,它似乎就停止監聽您創建的綁定。
我還沒有運行您的代碼,但是我懷疑WPF也不會通知您。 我猜測沒有異常,警告,甚至沒有調試行寫入“輸出”窗口。
似乎一對綁定是這里的問題。 我建議您做的是:
ConvertBack
方法,使ValueConverter成為雙向轉換器。 (如果您的轉換器所做的只是在Collapsed
和Visible
之間交換,那么ConvertBack
可能只調用Convert
。) Mode=TwoWay
,使其中一個綁定(與哪個綁定無關)成為雙向,並刪除另一個綁定。 一個TwoWay
結合將足以在你的兩個控件之間的雙向通信。 編輯 :我對ConvertBack
評論是您可以實現它,如下所示:
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return Convert(value, targetType, parameter, culture);
}
這是因為您的轉換器所做的只是在Visible
和Collapsed
之間交換,並且一種轉換方式與向后轉換相同。 這個評論本質上是放在一邊的。 當然你也可以實現ConvertBack
如你所願,但你將需要實現ConvertBack
如果您使用的是轉換器的TwoWay
結合。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.