数据绑定到索引属性

时间:2010-11-08 07:26:44

标签: c# wpf data-binding mvvm indexer

我有一个控件绑定到实现INotifyPropertyChanged的对象的索引属性

问题是,我不知道如何通知该特定索引字符串的属性更改信号。

有人告诉我,我可以使用 OnPropertyChanged(“”)来通知整个对象需要更改。

但我需要的是像 OnPropertyChanged(“某些索引属性字符串”)。

无论如何都要这样做?

非常感谢。

PS:

我要做的是应用MVVM模式。 我使用viewmodel类来包装普通的POCO对象。所以当我绑定时,我绑定到[index属性],以便我可以通知已更改。这种方法使我免于:

  1. 为我需要的每个属性包装内部域POCO对象。
  2. 在每个包装的财产中更改通知属性。
  3. CODE

    public class ViewModelEx<T_Self, T_Core> : ViewModelEx<T_Self> where T_Self : ViewModelEx<T_Self, T_Core>
    {
    private static Type _s_coreType = typeof(T_Core);
    private static Dictionary<string, PropertyInfo> _s_corePropInfos = new Dictionary<string, PropertyInfo>();
    
    private static PropertyInfo GetPropertyInfo(string prop)
    {
        if (_s_corePropInfos.ContainsKey(prop) == false)
            _s_corePropInfos.Add(prop, _s_coreType.GetProperty(prop));
    
        return _s_corePropInfos[prop];
    }
    
    public T_Core Core { get; set; }
    
    public object this[string propName]
    {
        get
        {
            return GetPropertyInfo(propName).GetValue(Core, null);
        }
        set
        {
            GetPropertyInfo(propName).SetValue(Core, value, null);
            IsModified = true;
            //RaisePropertyChanged(propName);
            RaisePropertyChanged("");
        }
    }
    
    public R Val<R>(Expression<Func<T_Core, R>> expr)
    {
        return (R)this[Core.GetPropertyStr(expr)];
    }
    
    public void Val<R>(Expression<Func<T_Core, R>> expr, R val)
    {
        this[Core.GetPropertyStr(expr)] = val;
    }
    

1 个答案:

答案 0 :(得分:3)

您无法在WPF中为特定索引绑定创建通知,您只能通知所有索引绑定:

RaisePropertyChanged(Binding.IndexerName);

哪个应该与:

相同
RaisePropertyChanged("Item[]");

您可以使用IndexerNameAttribute覆盖此字符串。

在Silverlight中,您实际上可以在括号内指定一个索引,仅影响该特定绑定。