c# - x :Bind in UWP (Universal Windows Platform)

标签 c# xaml mvvm uwp

对。所以从 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 中有一个公共(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} 中使用它。小路。
  • 正如 IInspectable 所指出的,{x:Bind} 的默认模式是 OneTime , 不像 {Binding}使用 OneWayTwoWay在几乎所有情况下。所以你需要明确指定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/

    相关文章:

    c# 将对象添加到列表框并在其中显示对象字符串

    c# - 为什么 JSON 中日期时间的行为在不同系统(win xp、server 2003)上不同?

    c# - 如何对线程安全队列进行单元测试

    c# - LocalStorage 重定向 Windows Phone 7

    c# - 当我完成 View 和 ViewModel 而不是 Model 时,如何删除事件处理程序

    c# - WebException 响应未返回完整响应

    c# - WPF ListBox 自定义控件问题

    c# - 使用 ViewModel 将子项添加到用户控件?

    ios - 使用 Array 实现 Swift ViewModel

    asp.net - 部分回发后重新初始化 Angular 绑定(bind)