【问题标题】:How to force View to update bound properties in Xamarin Forms?如何强制 View 更新 Xamarin Forms 中的绑定属性?
【发布时间】:2017-08-31 21:49:54
【问题描述】:

我想强制更新内容页面中的数据绑定属性。在这种情况下是ContentPage Title 参数。

<ContentPage x:Class="Containers.Views.ContainerPage" 
         xmlns="http://xamarin.com/schemas/2014/forms" 
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         Title="{Binding SomeStringProperty}"
         Appearing="ContentPage_Appearing">

我得到的最接近的是这个,但它不起作用。

    private void ContentPage_Appearing(object sender, EventArgs e)
    {
        this.BindingContext = null;
        this.BindingContext = myClassInstance;
    }

我不想实现onPropertyChange 事件。我只想“刷新”视图的有界数据。

【问题讨论】:

  • 您的 BindingContext 类是否实现了 INotiftyPropertyChanged?
  • 是的,它确实继承了BaseDataObject,它继承自实现INotifyPropertyChangedObservableObject
  • 但我不想在事件更改属性上实现。
  • 嗯,这是更新数据绑定属性的正确解决方案 - 触发 PropertyChanged 事件。如果您不想编写所有样板代码,请改用 Fody 包。
  • 为什么不想使用 INofifyPropertyChanged?

标签: c# xaml xamarin data-binding xamarin.forms


【解决方案1】:

如果您的视图模型已经实现 INotifyPropertyChanged - 您可以尝试使用 null/empty 参数引发 PropertyChangedEvent - 这应该会强制更新所有绑定属性 - more details here

public void RaiseAllProperties()
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(null));
}

【讨论】:

  • 限制:不幸的是,如果创建 BindableObject 的子类(以便 BindableObject 处理 INotifyPropertyChanged 的​​一些细节),这将不起作用。获取编译器错误“事件 BindableObject.PropertyChanged 只能出现在 += 或 -= 的左侧。”。但是,如果滚动自己的 INotifyPropertyChanged 实现者,了解它是有用的。
  • @ToolmakerSteve 你有解决方案吗?我目前遇到了这个问题。
  • @JonathanPeel - 不。我使用数据绑定的次数越多,我遇到的复杂情况就越多,它不能很好地处理(或者很难调试)。当我有机会时,我将在毛伊岛调查 MVU。希望这是一种更直接的方式来协调视图和模型。
  • 当页面在 shell 中,被隐藏(在其他选项卡中或其他页面下方)并且它的渲染器被“出于性能原因”设置为在页面到达顶部后重新创建时提及有趣的时间,那么在那些渲染器不可用的时候,页面根本不会更新它的绑定。当该页面最终出现时为客户和开发人员创造一个惊喜将完全是旧值..
猜你喜欢
  • 2017-06-26
  • 1970-01-01
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 2016-06-19
  • 1970-01-01
相关资源
最近更新 更多