【发布时间】:2017-02-01 03:33:09
【问题描述】:
没错。所以从 WPF 转移到 UWP,我试图使用 x:Bind 来获得编译时的好处。简单的场景工作正常;但是我发现了一些我无法解决的问题。它们都是相关的,所以我想我会将它们发布在一个地方:
- 我无法让 Intellisense 与
x:Bind一起工作。我在 XAML 和构造函数中都设置了 DataContext(以及d:DataContext,就像我们在 WPF 中所做的那样),但无论如何它都不会显示成员。有没有人成功做到这一点? - 然后我在某处读到,在 UWP 中,
DataContext始终设置为Page的代码隐藏(真的吗??),我需要在代码隐藏中定义一个 ViewModel 类型属性,然后使用它x:Bind中的财产。它是否正确?我试过了,它有效,但引发了下一个问题。 - 如果我在 Page 的代码隐藏中定义 ViewModel 类型的属性,任何引发
PropertyChanged通知的子属性都不会更新 UI。例如,如果代码隐藏属性被命名为Game(GameVM类型)并且GameVM中有一个名为Player(GamePlayer类型)的公共属性,而GamePlayer又包含一个名为Name的属性,x:Bind路径将类似于{x:Bind Path=Game.Player.Name}。但是,如果我这样做,从Name属性中引发的任何更改通知都不会更新 Page 的 UI。
我尝试过的另一种方法是在每个级别收听 PropertyChanged,然后将其向上冒泡,但这并没有奏效。即使确实如此,这样做似乎也有点太多工作了。在 WPF 中,Game.Player.Name 等子属性可以正常工作,而无需进行属性更改冒泡。还是我错过了什么?
【问题讨论】:
-
第一点:在获得建议之前,您总是需要构建项目。我总是构建项目,然后打开属性窗口,然后从可能的资源列表中选择绑定源
-
@MatthiasHerrmann:这不是问题所在。我已经多次构建了该项目。请阅读我在下面 Monish 的回答中的讨论。
-
{x:Bind}的默认模式是OneTime。在大多数情况下,{Binding}的默认值为OneWay。相关问答:With compiled bindings (x:bind), why do I have to call Bindings.Update()?. -
@IInspectable:哎呀。那会造成严重破坏。让我读。