簡體   English   中英

通過數據綁定和值轉換器顯示兩個控件

[英]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具有檢測和避免數據綁定中堆棧溢出的方法。 我知道一個 ,看來您找到了另一個。

當您更改其中一個控件的可見性時,會發生類似以下的事情(至少在理論上是這樣):

  • 您更改了TextBlock的可見性(例如),
  • 這會導致TextBox的可見性發生變化,
  • 然后,這會導致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如你所願,但你將需要實現ConvertBack如果您使用的是轉換器的TwoWay結合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM