SetProperty ref - Object为null

时间:2017-05-24 08:47:07

标签: c# wpf mvvm properties prism

我想这只是一个我忽视的小事,但我无法弄清楚为什么这不起作用......

public ObservableCollection<UserDto> Users
{
    get
    {
        return _users;
    }
    set
    {
        SetProperty(ref _users, value);
    }
}

现在,当我像这样设置Users时,它仍然是null

pageItem.Object.Users = new ObservableCollection<UserDto>();

如果我使用像这样的“标准”属性,我可以使它工作:

public ObservableCollection<UserDto> Users { get; set; }

但为什么它不适用于SetProperty(ref variable, value)

修改

我正在使用 .NET Framework 4.5

我也调试了代码。在第一个屏幕截图中,_usersnull,我尝试设置value,其中包含一个UserDto

var newUsers = new ObservableCollection<UserDto>();
var user = new UserDto();
newUsers.Add(user);
pageItem.Object.Users = newUsers;  // This steps into the setter

enter image description here

在此步骤之后,_users仍为null

enter image description here

3 个答案:

答案 0 :(得分:0)

SetProperty不是内置方法。如果在调用此方法后_users字段仍为null,则该方法显然未正确实现。

您可以看一下如何在Prism中实际实现SetProperty方法,并将此实现与您的实现进行比较:

protected virtual bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = null)
{
    if (Equals(storage, value)) return false;

    storage = value;
    RaisePropertyChanged(propertyName);

    return true;
}

https://github.com/PrismLibrary/Prism/blob/master/Source/Prism/Mvvm/BindableBase.cs

出于测试目的,您可以将上述实现粘贴到您的类中,为方法指定另一个名称并调用此名称而不是当前的SetProperty方法。

如果您使用Prism的SetProperty版本,它应该可以使用。如果它没有证明你的观点:https://stackoverflow.com/help/mcve

答案 1 :(得分:0)

问题在于我使用Mock http://www.developerhandbook.com/unit-testing/writing-unit-tests-with-nunit-and-moq/作为PageItem

Mock<GroupCarouselViewPageItem> pageItem = new Mock<GroupCarouselViewPageItem>();

如果我删除模拟并只使用GroupCarouselViewPageItem作为类型,它将起作用...不是100%确定原因,但它解决了问题。

GroupCarouselViewPageItem i = new GroupCarouselViewPageItem();

感谢您的帮助!

答案 2 :(得分:0)

您应该像这样创建pageItem

Mock<GroupCarouselViewPageItem> pageItem = new Mock<GroupCarouselViewPageItem>() 
{
   CallBase = true;
};

SetPropertyBindableBase类中Prism库中的虚方法,因此如果您创建了GroupCarouselViewPageItem的模拟,则将调用非虚拟方法。特别是SetProperty方法,用于更改_users字段的值。 设置CallBase = true将导致调用所有虚拟实现。