【问题标题】:Xamarin.Forms BindableProperty binding not firing in some casesXamarin.Forms BindableProperty 绑定在某些情况下不会触发
【发布时间】:2018-02-09 22:24:21
【问题描述】:

代码示例,显示 BindableProperty 存在一些奇怪的问题。 代码位于 GitHub https://github.com/jonilviv/BindableProperty-issue.git 这是一个包含 3 个项目的 Xamarin.Forms 解决方案:

  • 通用 .NET Standard 项目
  • Android 项目
  • iOS 项目
  • UWP 项目

共同的项目是用户控制CustomTextView,基于ContentView。此控件具有 BindableProperty 文本。主窗口有 3 个自定义控件。还有一个奇怪的行为:

  1. Label Text 属性绑定到 ViewModel 属性 TextValue
  2. 我们更改 CS 代码中的 Text 属性 - 一切正常。
  3. 我们将 Text 属性绑定到 ViewModel 属性 TextValue。还有一个问题:当TextValue改变时-Text属性没有改变。
  4. 我们将静态文本设置为属性Text,一切正常。

【问题讨论】:

  • 请为您的问题提供一个最小、完整且可验证的示例:stackoverflow.com/help/mcve
  • 问题非常非常复杂:可视化多控制解决方案中的项目很少。最少可能的代码在 GitHub github.com/jonilviv/BindableProperty-issue
  • 如果没有 MCVE,我们无法帮助您调试。我们不会通读整个项目的代码来帮助您。至少您应该向我们展示属性设置器的代码,该代码未正确触发更改通知 + 任何调用的函数。也是您为属性/它的支持字段分配值的所有地方。

标签: c# binding xamarin.forms


【解决方案1】:

我认为有两种解决方案:

  1. 在 propertychanged 事件中直接设置标签文本
  2. 将绑定更改为类似Text="{Binding Text, Source={x:Reference controlName}}" 并设置您的控件名称。我认为你现在应该在这个当前绑定中得到错误。还是我错了?

查看模型的代码。这是不正确的。 TextValue 属性应该是简单属性,而不是 BindableProperty。您需要在视图模型中实现 INotifyPropertyChanged,因此它会引发更改以更新视图。阅读它here

==更新==

将 BindableObject 作为 ViewModel 有点奇怪。你会得到很多不需要的方法。

启动您的代码并遇到绑定错误:

  • [0:] 绑定:在“App2.CustomTextView”上找不到“TextValue”属性,目标属性:“App2.CustomTextView.Text”
  • [0:] 绑定:在“App2.CustomTextView”上找不到“TextValue”属性,目标属性:“App2.CustomTextView.Text”

我认为 BindingDataContext 未正确设置为该元素,因此它不会更新文本。设置名称表单 MainPage 像 x:Name="Page" 并像这样绑定

  • Text="{Binding BindingContext.TextValue, Source={x:Reference Page}}"

【讨论】:

  • 不幸的是 1 和 2 是不可能的,因为我们没有事件。主要问题在于,这甚至没有提出。 ViewModel 是正确的,因为 BindableObject 在后台有基本的实现。我也是从INotifyPropertyChanged 的基本实现开始的。
  • 更新了我的答案,检查更新:)
  • 非常感谢!这对我有用。我还创建了单独的分支,其中 viewModel 基本上实现了。
猜你喜欢
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多