x:在UWP中绑定(通用Windows平台)

dot*_*NET 4 c# xaml mvvm uwp

对.所以从WPF转到UWP,我试图x:Bind用来获得编译时的好处.简单的场景工作正常; 但是我发现了一些我无法解决的问题.它们都是相关的,所以我想我会把它们放在一个地方:

  1. 我无法使用Intellisense x:Bind.我d:DataContext在XAML和构造函数中都设置了DataContext(以及我们在WPF中的操作),但无论如何都不会显示成员.有人做过这个吗?
  2. 然后我读到某个地方,在UWP中,DataContext总是设置为Page代码隐藏(真的??),我需要在代码隐藏中定义一个ViewModel类型属性,然后使用该属性x:Bind.它是否正确?我尝试了它并且它有效但引起了下一个问题.
  3. 如果我在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工作正常而不必进行属性更改冒泡.或者我错过了什么?

dot*_*NET 9

对.在玩了几天并搜索了大量的参考资料后,我的发现如下:

  1. {x:Bind}缺乏设计时支持.该功能虽然在愿望清单上.你可能想在那里投票.(新版本的Visual Studio 15.4.4以所需方式支持{x:Bind}中的Intellisense.)
  2. {x:Bind}使用代码隐藏作为其DataContext.因此,您需要在代码隐藏中定义ViewModel类型的公共属性,然后在{x:Bind}路径中使用它.
  3. 正如IInspectable所指出的那样,默认模式{x:Bind}OneTime,与{Binding}使用OneWayTwoWay几乎在所有情况下不同.因此,您需要Mode在绑定中明确指定.来自WPF的人应该特别注意它.
  4. 实现通知更改的子属性完全正常{x:Bind}.无需在属性层次结构中向上冒泡这些通知.我面临的问题(问题中的#3)是因为我的子属性是类型的List<T>.我把它改成了ObservableCollection<T>,它开始工作了.

希望这能让人有所作为.