【问题标题】:Windows Phone 8.1 RT view not updating (MVVM)Windows Phone 8.1 RT 视图未更新 (MVVM)
【发布时间】:2014-12-06 21:12:46
【问题描述】:

我正在为用户设计个人资料页面,他们可以在其中编辑个人信息。我正在使用 PersonViewModel(其中包含当前登录的人员)来显示有关用户的当前信息。编辑用户信息的字段绑定到验证模型。按下“执行更改”按钮后,我得到服务器的响应(HTTPStatusCode Ok + 更改的用户对象),我根据更改更改现有对象的字段。然后我使用setter注入来更新我的PersonViewModel...调试时,我可以看到我的对象都是最新的,但我的视图仍然显示旧信息...我做错了什么?`

这是我按下按钮执行更改时执行的代码:

    private async void ChangeInfoButton(object sender, RoutedEventArgs e)
    {
        User user;
        List<ErrorInfo> errors;
        if (_profileInformationValidationModel.TryGetUser(out user, out errors))
        {
            var response = await Session.Instance.DataProvider.UpdaterUserInfo(user);

            if (response.IsSuccess)
            {
                /*SignedInUserInfo = AlteredUserInfo*/
                Session.Instance.User.Information = user.Information;  
                _personViewModel.SetPerson(user.Information);
                var d1 = new MessageDialog("Uw gegevens werden succesvol gewijzigd.");
                d1.ShowAsync();

                AnnulInfoButton(sender, e);
            }

` 这是 PersonViewModel:

public class PersonViewModel
{
    private Person _person;

    public void SetPerson(Person p)
    {
        _person = p;
    }

    public PersonViewModel(Person person)
    {
        _person = person;
    }

    public string Street
    {
        get { return _person.Street; }
    }

    public string HouseNumber
    {
        get { return _person.HouseNumber; }
    }

    public string Bus
    {
        get { return _person.Bus; }
    }

    public string Email
    {
        get { return _person.Email; }
    }

【问题讨论】:

  • 您的 mvvm 模式不正确。你的模型和你的模型之间几乎没有什么区别。发布您的 xaml 绑定。

标签: xaml mvvm windows-phone-8.1


【解决方案1】:

您的视图模型应该实现INotifyPropertyChanged 接口。

考虑使用像 MVVM Light 这样的框架,它可以为您完成大部分工作。

您可以使用 NuGet 将其添加到您的项目中。

这是您的模型和视图模型的外观:

public class Person
{

    public string Street { get; set; }

    public string HouseNumber { get; set; }

    public string Bus { get; set; }

    public string Email { get; set; }
}

public class PersonViewModel : System.ComponentModel.INotifyPropertyChanged
{
    private Person _person;

    public void SetPerson(Person person)
    {
        _person = person;
        Street = person.Street;
        HouseNumber = person.HouseNumber;
        Bus = person.Bus;
        Email = person.Email;
    }

    public PersonViewModel(Person person)
    {
        SetPerson(person);
    }

    #region Street (INotifyPropertyChanged Property)
    private string _street;

    public string Street
    {
        get { return _street; }
        set
        {
            if (_street != value)
            {
                _street = value;
                RaisePropertyChanged("Street");
            }
        }
    }
    #endregion


    #region HouseNumber (INotifyPropertyChanged Property)
    private string _houseNumber;

    public string HouseNumber
    {
        get { return _houseNumber; }
        set
        {
            if (_houseNumber != value)
            {
                _houseNumber = value;
                RaisePropertyChanged("HouseNumber");
            }
        }
    }
    #endregion

    #region Bus (INotifyPropertyChanged Property)
    private string _bus;

    public string Bus
    {
        get { return _bus; }
        set
        {
            if (_bus != value)
            {
                _bus = value;
                RaisePropertyChanged("Bus");
            }
        }
    }
    #endregion


    #region Email (INotifyPropertyChanged Property)
    private string _email;

    public string Email
    {
        get { return _email; }
        set
        {
            if (_email != value)
            {
                _email = value;
                RaisePropertyChanged("Email");
            }
        }
    }
    #endregion


    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
    private void RaisePropertyChanged(string p)
    {
        var propertyChanged = PropertyChanged;
        if (propertyChanged != null)
        {
            propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(p));
        }
    }


}

【讨论】:

  • 我的 person 对象已经实现了这个接口。只是为了确保我也实现了视图模型,但它没有任何区别。你确定我正确地实现了我的视图模型吗?
  • 你的视图模型应该实现它,而不是你的模型。它中的属性也应该引发 PropertyChanged 事件。
  • 我已经改过了,没有任何区别。我尝试使用 setter 注入来更新用户对象,但这也没有成功。其他想法?
  • 我用我发布的代码进行了测试,它对我有用,所以我需要更多关于你的问题的上下文来重现它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-04
  • 2016-08-22
相关资源
最近更新 更多