我想让这个动态类
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,然后再绑定到其中的键。
<TextBox Text="{Bind Path=Foo}"/>
<TextBox Text="{Bind Path=Bar}"/>在我的视图模型代码中的某处,我将拥有
var vm = new FooViewModel();
vm.Set("Foo", "Yeah!");
vm.Set("Bar", "Booh!");像这样做自定义绑定的诀窍是什么?
发布于 2013-04-29 15:42:11
您可以从DynamicObject或实现IDynamicMetaObjectProvider派生您的类。这应该可以做到这一点,因为WPF支持绑定到动态对象。
http://www.shujaat.net/2012/09/dynamicobject-wpf-binding.html就是一个很好的例子
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
}https://stackoverflow.com/questions/16273371
复制相似问题