我想要一个项目列表,可以显示项目的“希腊语”或“英语”名称,具体取决于用户在两者之间切换。列表中的所有项目都实现了INPC。
由于每个项目都有GreekName属性和RomanName属性,因此我使用的策略是简单地更改项目DisplayName属性。单元测试和日志输出表明每个项目的DisplayName确实发生了变化并触发了INPC,但列表没有更新。
列表是ObservableCollection。我想知道这是否因为哈希码没有改变而无法更新?这是否意味着用新的替换列表中项目的唯一方法是什么?
以下一些代码......
干杯,
Berryl
public class MasterViewModel : ViewModelBase
{
public ObservableCollection<DetailVm> AllDetailVms
{
get { return _allDetailVms; }
}
private readonly ObservableCollection<DetailVm> _allDetailVms;
void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) {
if (e.NewItems != null && e.NewItems.Count != 0)
foreach (DetailVm vm in e.NewItems) vm.PropertyChanged += OnGreekGodChanged;
if (e.OldItems != null && e.OldItems.Count != 0)
foreach (DetailVm vm in e.OldItems) vm.PropertyChanged -= OnGreekGodChanged;
}
private void OnGreekGodChanged(object sender, PropertyChangedEventArgs e)
{
var detailVm = (DetailVm)sender;
// if DisplayName has changed we want to refresh the view & its filter
var displayName = ExprHelper.GetPropertyName<DetailVm>(x => x.DisplayName);
if (e.PropertyName == displayName)
Log.Info("'{0} reports it's display name has changed", detailVm.DisplayName);
}
private void _flipGreekOrRomanDisplay(string newName, Func<DetailVm, string> property)
{
foreach (var detailVm in _allDetailVms)
{
Log.Info("To '{0}', before change: '{1}'", newName, detailVm.DisplayName);
detailVm.DisplayName = property(detailVm);
Log.Info("To '{0}', after change: '{1}'", newName, detailVm.DisplayName);
}
NameFilterLabelText = newName;
NotifyOfPropertyChange(() => NameFilterLabelText);
NotifyOfPropertyChange(() => UseGreekName);
NotifyOfPropertyChange(() => UseRomanName);
}
}
答案 0 :(得分:0)
我的愚蠢 - 我的数据绑定已关闭。代码很好,视图根据预期更新INPC的项目进行更新。