【发布时间】:2018-07-30 03:13:00
【问题描述】:
例如,如果我有一个 TextBlock,其 Text 属性绑定到我的 ViewModel 中的某个字符串,如果 TextBlock 的 Visibility 设置为 Invisible,该绑定是否会继续侦听 ViewModel 字符串的更改?
【问题讨论】:
标签: .net xaml data-binding uwp c#-2.0
例如,如果我有一个 TextBlock,其 Text 属性绑定到我的 ViewModel 中的某个字符串,如果 TextBlock 的 Visibility 设置为 Invisible,该绑定是否会继续侦听 ViewModel 字符串的更改?
【问题讨论】:
标签: .net xaml data-binding uwp c#-2.0
是的,它会继续监听变化!
绑定机制涉及在依赖对象中定义的 CLR 类型(源)和依赖属性(目标),并且不受当前定义其某些属性的方式的限制,除非明确定义了相关性。
构成Binding 进程的原因是我们为CLR 对象提供了实现,以将其更改传达给我们的视图 中定义的对象,而且我们还提供了以下事实:让我们的依赖对象属性查找此通知。这是一种独立于目标对象的Visibility 的机制。
否则想象一下我们使用来自某个ViewModel 的布尔属性来控制视图中控件的Visibility 的情况。使用最新的 SKD 版本时,系统会在您使用 x:Bind 时自动为您处理此问题,但假设您正在使用 {Binding } 标记来定义您的绑定。
你必须做什么?定义一个Converter 以将布尔值转换为Visibility 枚举和相反的值。
ViewModel 布尔标志设置为 false,这将映射到 Collapsed。如果您将 boolean 属性更改为 true 并将该通知传播到目标控件,现在会发生什么? 由于您的控件被设置为将其Vibility 设置为Collapsed,它将停止侦听 boolean 属性,并且无法实际拥有control Visibility 设置为 Visible,除非我们强制这样做,即使我们已将 boolean 标志更改为 true 并传播通知。
将您的元素设置为 Collapsed 仅意味着在布局上没有为其保留空间,因此不会显示。 但是构成下面元素的内容可以并且仍然会根据请求进行多次更新。
【讨论】: