【问题标题】:Realm + RaisePropertyChanged not being raised for properties with codeRealm + RaisePropertyChanged 没有为带有代码的属性引发
【发布时间】:2020-09-23 12:33:12
【问题描述】:

我有一个具有这两个属性(IntOption 和 Option)的 RealmObject:

public enum Option { A, B, C }

public class MyObject : RealmObject
{
    [PrimaryKey]
    public string Id { get; set; }
    public int IntOption { get; set; }
    public Option Option
    {
        get => (Option)IntOption;
        set
        {
            IntOption = (int)value;
            RaisePropertyChanged();
        }
    }
}

基本上,Realm 不允许您存储枚举属性,因此我同时拥有枚举属性和正在存储的实际 Int 值。到目前为止,一切顺利。

现在,奇怪的事情。如果我将这两个属性绑定到 XAML 文件中的标签,就像:

 <Label Text="{Binding Option}" />
 <Label Text="{Binding IntOption}" />

我在 C# 中为 Option 赋值:

myVariable.Option = Option.A;

绑定到 IntOption 属性的标签使用新值更新,但绑定到 Option 的标签不会。

经过多次调试,我认为这里的关键元素是绑定到XAML页面的元素,以及正在被代码修改的元素,是两个不同的变量/对象实例,但我不知道是什么领域这样做是为了让 IntOption 实际上更新所有绑定,但 RaisePropertyChanged(它本身就是一个应该这样做的领域方法)没有。

我应该怎么做才能让 Option 在属性更改时更新所有绑定,就像 IntOption 一样?

【问题讨论】:

  • 嗨!你解释的那种行为很奇怪。尝试在 RaisePropertyChanged 方法中显式发送属性的名称。类似:RaisePropertyChanged(nameof(Option));RaisePropertyChanged(nameof(IntOption)); 试试这个,让我们知道结果。
  • 不幸的是,这是我尝试的第一件事,但没有任何区别:(

标签: c# xamarin xamarin.forms realm


【解决方案1】:

我仍然想知道是否有更简单/更好的方法,但目前我已经通过覆盖 OnPropertyChanged 方法解决了这个问题。由于 Realm 内部处理的属性确实在 Realm 记录的所有 .Net 实例上引发 PropertyChanged 事件,我可以检查该属性是否已更新,并为依赖它的那些引发 PropertyChanged 事件:

    protected override void OnPropertyChanged(string propertyName)
    {
        if (propertyName == nameof(IntOption))
        {
            RaisePropertyChanged(nameof(Option));
        }

        base.OnPropertyChanged(propertyName);
    }

【讨论】:

  • 我认为这种方法没有任何问题。我会去的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
  • 2010-09-08
  • 1970-01-01
  • 2014-08-06
  • 2019-01-12
  • 1970-01-01
相关资源
最近更新 更多