【问题标题】:How to update Xamarin Data Binding when source changed源更改时如何更新 Xamarin 数据绑定
【发布时间】:2020-07-29 11:43:25
【问题描述】:

我有 2 个标签,它们是数据绑定到我的个人资料概览页面上的一个对象,让我们假设:

public class Profile
{
    string FirstName { get; set; }
    string LastName {get; set; }
}

我有一个配置文件编辑页面,允许用户更改属性。在此页面的视图模型中,我们传递了 Profile 对象,我们对此进行了克隆,因此如果用户选择不保存,我们可以取消任何更改而不会影响数据绑定标签。

但是,当用户保存更改时,克隆的 Profile 对象被传递回调用视图模型,现在我如何使用克隆的对象更新原始 Profile 对象,如下所示:

originalProfile = clonedProfile;

不起作用,因为数据绑定没有更新,这是预期的行为。如此短的手动更新属性的属性,实现这一点的最佳方法是更新数据绑定控件?

希望这是有道理的。

【问题讨论】:

    标签: c# xamarin data-binding


    【解决方案1】:

    您需要在 Model 和 ViewModel 中都实现接口 INotifyPropertyChanged,以便 UI 将在运行时更新。

    在视图模型中

    public class xxxViewModel: INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
    
    
      
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    
    
       
    
        Profile _originalProfile ;
    
        Profile originalProfile { 
            
            get
            {
                return _originalProfile ;
            }
    
            set
            {
                if(_originalProfile !=value)
                {
                    _originalProfile = value;
                    OnPropertyChanged("originalProfile");
                }
            }
        }
    
    
    
    
    }
    

    在模型中

    public class Profile: INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
    
        
      
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    
    
        string firstName ;
    
        string FirstName { 
            
            get
            {
                return firstName ;
            }
    
            set
            {
                if(firstName !=value)
                {
                    firstName = value;
                    OnPropertyChanged("FirstName");
                }
            }
        }
    
        string lastName ;
    
        string LastName { 
            
            get
            {
                return lastName ;
            }
    
            set
            {
                if(lastName !=value)
                {
                    lastName = value;
                    OnPropertyChanged("LastName ");
                }
            }
        }
    }
    

    更新

    你可以在 Profile 中添加一个方法

    // 
    void UpdateValue(Profile newValue)
    {
      this.FirstName = newValue.FirstName;
      //...
    }
    

    现在在 ViewModel 中你只需要像下面这样调用它。

    originalProfile.UpdateValue(clonedProfile);
    

    【讨论】:

    • 嘿,谢谢你的回答,但不是这样。我已经实现了 INPC,但是当您“热交换”绑定源时这不起作用。 INPC 仅在更新单个属性时更新 UI 上的绑定控件。
    • 你可以设置originalProfile.FirstName = clonedProfile.FirstName ;
    • 是的,我意识到我可以做到这一点,并且我给出的示例非常简单,但是对于这个项目,有很多属性,而不仅仅是 2。我只是想知道是否有更好的方式而不是设置每个属性?
    • 检查我的更新答案。我认为这是一种更好的封装方式。
    • 谢谢卢卡斯,我希望有更简单的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 2013-02-03
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多