首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >由字典支持的WPF中的自定义INPC类型

由字典支持的WPF中的自定义INPC类型
EN

Stack Overflow用户
提问于 2013-04-29 15:31:49
回答 1查看 405关注 0票数 1

我想让这个动态类

代码语言:javascript
复制
class FooViewModel : INotifyPropertyChanged {

    private Dictionary<string, object> data = new Dictionary<string, object>();

    public void Set(string path, object value)
    {
        data[path]=value;
        NotifyPropertyChanged(path);
    }

    public object Get(string path)
    {
        if(data.ContainsKey(path)){
            return data[path];
        }else{
            return null;
        }
    }


    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged( String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

如果我将它设置为某个WPF XAML的DataContext,我希望能够将数据绑定到two way bind,然后再绑定到其中的键。

代码语言:javascript
复制
<TextBox Text="{Bind Path=Foo}"/>
<TextBox Text="{Bind Path=Bar}"/>

在我的视图模型代码中的某处,我将拥有

代码语言:javascript
复制
var vm = new FooViewModel();
vm.Set("Foo", "Yeah!");
vm.Set("Bar", "Booh!");

像这样做自定义绑定的诀窍是什么?

EN

Stack Overflow用户

回答已采纳

发布于 2013-04-29 15:42:11

您可以从DynamicObject或实现IDynamicMetaObjectProvider派生您的类。这应该可以做到这一点,因为WPF支持绑定到动态对象。

http://www.shujaat.net/2012/09/dynamicobject-wpf-binding.html就是一个很好的例子

代码语言:javascript
复制
class ViewModelBase : DynamicObject, INotifyPropertyChanged
{
    #region Private Members

    private Dictionary<string, object> _dynamicProperties;

    #endregion Private Members

    #region Constructor

    public ViewModelBase(IEnumerable<string> propertyNames)
    {
        if (propertyNames == null)
        {
            throw new Exception("propertyNames is empty");
        }

        _dynamicProperties = new Dictionary<string, object>();
        propertyNames
            .ToList()
            .ForEach(propName => _dynamicProperties.Add(propName, null));
    }
    #endregion Constructor

    #region Public Methods

    public void SetPropertyValue(string propertyName, object value)
    {
        if (_dynamicProperties.ContainsKey(propertyName))
        {
            _dynamicProperties[propertyName] = value;
            OnPropertyChanged(propertyName);
        }
    }

    public object GetPropertyValue(string propertyName)
    {
        return _dynamicProperties.ContainsKey(propertyName) ? _dynamicProperties[propertyName] : null;
    }

    #endregion Public Methods

    #region DynamicObject Overriden Members

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        bool ret = base.TryGetMember(binder, out result);

        if (ret == false)
        {
            result = GetPropertyValue(binder.Name);
            if (result != null)
            {
                ret = true;
            }
        }

        return ret;
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        bool ret = base.TrySetMember(binder, value);

        if (ret == false)
        {
            SetPropertyValue(binder.Name, value);
            ret = true;
        }

        return ret;
    }

    #endregion DynamicObject Overriden Members

    #region INotifyPropertyChanged Implementation

    public event PropertyChangedEventHandler PropertyChanged = delegate { };
    private void OnPropertyChanged(string propertyName)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    #endregion INotifyPropertyChanged Implementation
}
票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16273371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档