对。所以从 WPF 转移到 UWP,我正在尝试使用 x:Bind
获得编译时的好处。简单的场景工作正常;但是我发现了一些我无法解决的问题。它们都是相关的,所以我想我会将它们发布在一个地方:
x:Bind
一起工作.我在 XAML 和构造函数中都设置了 DataContext(以及 d:DataContext
,就像我们在 WPF 中所做的那样),但无论如何它都不会显示成员。有没有人成功做到这一点? DataContext
始终设置为 Page
的代码隐藏(真的吗??),我需要在代码隐藏中定义一个 ViewModel 类型属性,然后在 x:Bind
中使用该属性.它是否正确?我试过了,它有效,但引发了下一个问题。 PropertyChanged
的子属性通知不会更新 UI。例如,如果代码隐藏属性名为 Game
(类型为 GameVM
)并且在 GameVM
中有一个公共(public)属性命名为 Player
(类型为 GamePlayer
),然后是 GamePlayer
包含一个名为 Name
的属性, x:Bind
路径看起来像 {x:Bind Path=Game.Player.Name}
.但如果我这样做,任何从 Name
内发出的更改通知属性不会更新 Page 的 UI。 我尝试过的一种替代方法是在每个级别上收听 PropertyChanged,然后将其冒泡到层次结构中,但这并没有奏效。即使确实如此,这样做似乎也有点太多工作了。在 WPF 子属性中,如
Game.Player.Name
无需进行属性更改冒泡即可正常工作。还是我错过了什么?
最佳答案
对。在玩了几天并搜索了许多引用资料之后,这是我的发现:
{x:Bind}
缺乏设计时支持。该功能位于 wishlist尽管。你可能想在那里投票。(新版Visual Studio 15.4.4 确实支持Intellisense in {x:Bind} 需要的方式。)
{x:Bind}
使用代码隐藏作为其 DataContext。因此,您需要在代码隐藏中定义 ViewModel 类型的公共(public)属性,然后在 {x:Bind}
中使用它。小路。 {x:Bind}
的默认模式是 OneTime
, 不像 {Binding}
使用 OneWay
或 TwoWay
在几乎所有情况下。所以你需要明确指定Mode
在你的绑定(bind)中。来自 WPF 的人应该特别注意它。 {x:Bind}
中工作得非常好。 .无需在属性层次结构中向上冒泡这些通知。我面临的问题(问题中的#3)是因为我的子属性是 List<T>
类型。 .我把它改成了 ObservableCollection<T>
它开始工作了。 希望这对某人有用。
关于c# - x :Bind in UWP (Universal Windows Platform),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39657957/