数据绑定到索引属性

发布于 2024-09-30 23:01:38 字数 1637 浏览 7 评论 0 原文

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

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

有人告诉我可以使用OnPropertyChanged("")来通知整个对象需要改变。

但我需要的是类似 OnPropertyChanged("Some index property string").

有办法做到这一点吗?

非常感谢。

ps:

我想做的是应用 MVVM 模式。 我使用 viewmodel 类来包装普通的 POCO 对象。因此,当我绑定时,我绑定到[index property],以便我可以通知更改。此方法使我免于:

  1. 为我需要的每个属性包装内部域 POCO 对象。
  2. 通知每个包装属性中的属性发生更改。

代码

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;
}

I have a control bind to an index property of an object which implements INotifyPropertyChanged.

The problem is, I don't know how to notify the property changed signal for that particular index string.

I was told that I can use OnPropertyChanged("") to notify the whole object need to be changed.

But what I need is something like OnPropertyChanged("Some index property string").

Is there anyway to do it?

Many thanks.

ps:

What I am trying to do is apply MVVM pattern.
I use a viewmodel class to wrap a normal POCO object. So when I bind, I bind to the [index property], so that I can notify changed. This method saves me from:

  1. wrap the inner domain POCO object for EVERY property I need.
  2. notify property changed in every wrapped property.

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;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

花辞树 2024-10-07 23:01:38

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

RaisePropertyChanged(Binding.IndexerName);

应该与以下内容相同:

RaisePropertyChanged("Item[]");

您可以使用 IndexerNameAttribute

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

You cannot create notifications for specific index bindings in WPF, you can only notify all index-bindings:

RaisePropertyChanged(Binding.IndexerName);

Which should be the same as:

RaisePropertyChanged("Item[]");

You could override this string using the IndexerNameAttribute.

(In Silverlight you can actually specify an index inside the brackets to only affect that specific binding.)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文