为啥在使用传统绑定时 bool 可以在没有转换器的情况下为可见性工作

Posted

技术标签:

【中文标题】为啥在使用传统绑定时 bool 可以在没有转换器的情况下为可见性工作【英文标题】:Why does bool work for visibility without a converter when using traditional binding为什么在使用传统绑定时 bool 可以在没有转换器的情况下为可见性工作 【发布时间】:2017-05-11 20:59:37 【问题描述】:

我之前和前几天已经创建并使用了 bool 到可见性转换器,但我忘记在绑定上使用转换器(我使用的是传统绑定)。我将视图中控件的可见性属性绑定到视图模型中的 bool 属性,令人惊讶的是它可以工作。所以我的问题是,如果它适用于传统绑定,为什么我们需要使用转换器?因为似乎编译器正在为我进行转换。

我在 Visual Studio Update 3 的 UWP 应用上对其进行了测试。 最小应用目标是 10.0.10586 目标版本是 10.0.14393

【问题讨论】:

你从哪里得到使用转换器的想法? @EBrown 我一直假设并且我已经看到人们在代码示例中使用它,我想我错了。 如果数据不需要转换就没有必要了。对于bool 之类的情况,您唯一需要使用它的情况是bool 值与预期意图相反。 【参考方案1】:

有趣。这一直是一个痛苦,它似乎在没有太多宣传的情况下得到了解决,我不知道这一点。

在 WPF 中,您总是必须使用 ValueConverter,因为 Visibility 不是布尔值。

我刚刚从我的项目中的 x:Bind ... 中删除了 BooleanToVisibility 转换,它确实仍然有效。我从生成的代码中挖掘了这个:

private void Update_ViewModel_ShowMessage(global::System.Boolean obj, int phase)            

  ...
  this.Update_ViewModel_ShowMessage_Cast_ShowMessage_To_Visibility(
    obj ? global::Windows.UI.Xaml.Visibility.Visible 
        : global::Windows.UI.Xaml.Visibility.Collapsed
   , phase);
...

显然它现在是内置的。

更新:

对于x:Bind ,它是在周年纪念更新中宣布的here。而且您确实需要以 14393 或更高版本为目标。对于较旧的版本,它仅适用于 Binding ...

【讨论】:

我想如果你想要“隐藏”而不是“折叠”,你仍然需要使用转换器。 在 UWP 中,Hidden 不再存在...可见性是一个有 2 个成员的枚举。 啊,这就为自动转换腾出了空间。 这是否也适用于 WPF 的完整桌面版本? @ScottChamberlain - 还没试过,但我不这么认为。

以上是关于为啥在使用传统绑定时 bool 可以在没有转换器的情况下为可见性工作的主要内容,如果未能解决你的问题,请参考以下文章

WPF 绑定不更新可见性

为啥 PDO 将我的 bool(false) 参数转换为 string('')?

SwiftUI 绑定布尔 if 语句(无法将类型 'Binding<Bool>' 的值转换为预期的条件类型 'Bool')

我在尝试转换我的 StatelessWidget 代码时遇到问题。为啥?

boost::variant - 为啥“const char*”转换为“bool”?

Angular 2 Reactive Forms 复选框 - 将 Bool 绑定到数字