0

我在数据模板中包含两个控件。控件#1 是称为“TXTBLOCK”的文本块。控件 #2 是一个名为“TXTBOX”的文本框:

TXTBLOCK 使用转换器将 Visibility 设置为 TextBox Visibility 以提供相反的值。

例子:

<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 上的第一篇文章......如果我错过了什么或需要提供更多信息,请原谅我。我很乐意这样做

谢谢!

4

1 回答 1

0

似乎 WPF 有检测和避免数据绑定中堆栈溢出的方法。 我知道一个,看来你找到了另一个。

当您更改其中一个控件的可见性时,会发生以下情况(至少在理论上):

  • 您更改 TextBlock 的可见性(例如),
  • 这会导致 TextBox 的可见性发生变化,
  • 这会导致 TextBlock 的可见性发生另一个变化,
  • 这会导致 TextBlock 的可见性再次发生变化,再次使用第一个绑定,
  • ...

如果不是 WPF 自动检测此类情况,这将永远持续下去,很可能会导致堆栈溢出。在这种情况下,一旦它检测到它可能会导致堆栈溢出,它似乎就会停止侦听您创建的绑定。

我没有运行你的代码,但我怀疑 WPF 也没有通知你。我猜没有异常、警告,甚至没有写入输出窗口的调试行。

看来这对绑定是这里的问题。我建议你做的是:

  • ConvertBack通过实现该方法,使您的 ValueConverter 成为双向转换器。(如果您的转换器所做的只是在 and 之间进行交换CollapsedVisibleConvertBack可能只需调用Convert。)
  • 通过添加 将其中一个绑定(无论哪个都无所谓)双向创建Mode=TwoWay,然后删除另一个绑定。TwoWay绑定足以在两个控件之间进行双向通信。

编辑:我的评论ConvertBack是您可以按如下方式实现它:

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

这是因为您的转换器所做的只是在 and 之间进行交换VisibleCollapsed并且转换一种方式与转换回来相同。这个评论基本上是旁白。您当然可以根据ConvertBack需要实现,但ConvertBack如果您在TwoWay绑定中使用转换器,则需要实现。

于 2012-08-28T22:09:53.890 回答