我想这只是一个我忽视的小事,但我无法弄清楚为什么这不起作用......
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 。
我也调试了代码。在第一个屏幕截图中,_users
为null
,我尝试设置value
,其中包含一个UserDto
:
var newUsers = new ObservableCollection<UserDto>();
var user = new UserDto();
newUsers.Add(user);
pageItem.Object.Users = newUsers; // This steps into the setter
在此步骤之后,_users
仍为null
:
答案 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;
};
SetProperty
是BindableBase
类中Prism库中的虚方法,因此如果您创建了GroupCarouselViewPageItem
的模拟,则将调用非虚拟方法。特别是SetProperty
方法,用于更改_users
字段的值。
设置CallBase = true
将导致调用所有虚拟实现。