C# 用户控件中的绑定
假设我有以下代码(在Winforms中): 如果在用户控件之外更改SomeClass.Name的值,则MyName属性永远不会更改。我做错了什么C# 用户控件中的绑定,c#,.net,winforms,binding,user-controls,C#,.net,Winforms,Binding,User Controls,假设我有以下代码(在Winforms中): 如果在用户控件之外更改SomeClass.Name的值,则MyName属性永远不会更改。我做错了什么 谢谢你如果你想要双向数据绑定,SomeClass必须推动或更改事件名。您可以自己实现它,但我强烈推荐这个项目 PS:我写了一些扩展方法来创建绑定,使之更容易,重构更友好。在您的情况下,它将如下所示: this.BindTo(inClass, c => c.MyName , m => m.Name); 方法本身: public static
谢谢你如果你想要双向数据绑定,SomeClass必须推动或更改事件名。您可以自己实现它,但我强烈推荐这个项目 PS:我写了一些扩展方法来创建绑定,使之更容易,重构更友好。在您的情况下,它将如下所示:
this.BindTo(inClass, c => c.MyName , m => m.Name);
方法本身:
public static class BindingExtensions
{
public static Binding BindTo<TControl, TControlProperty, TModel, TModelProperty>(this TControl control, TModel model, Expression<Func<TControl, TControlProperty>> controlProperty, Expression<Func<TModel, TModelProperty>> modelProperty, string format = null)
where TControl : Control
{
var controlPropertyName = ((MemberExpression)controlProperty.Body).Member.Name;
var modelPropertyName = ((MemberExpression)modelProperty.Body).Member.Name;
var formattingEnabled = !string.IsNullOrWhiteSpace(format);
var binding = control.DataBindings.Add(controlPropertyName, model, modelPropertyName, formattingEnabled, DataSourceUpdateMode.OnPropertyChanged);
if (formattingEnabled)
{
binding.FormatString = format;
}
return binding;
}
}
公共静态类绑定扩展
{
公共静态绑定BindTo(此TControl控件、TModel模型、Expression controlProperty、Expression modelProperty、string format=null)
其中TControl:Control
{
变量controlPropertyName=((MemberExpression)controlProperty.Body).Member.Name;
var modelPropertyName=((MemberExpression)modelProperty.Body).Member.Name;
var formatingenabled=!string.IsNullOrWhiteSpace(格式);
var binding=control.DataBindings.Add(controlPropertyName、model、modelPropertyName、formattingEnabled、DataSourceUpdateMode.OnPropertyChanged);
如果(已启用格式化)
{
binding.FormatString=格式;
}
返回绑定;
}
}
AUserControl
vsForm
工作正常(双向),但是AUserControl
vs另一个UserControl
不工作。这有点奇怪,因为UserControl
继承了实现IBindableComponent
的Control
,我可以创建自己的可绑定组件,它可以与其他控件一起工作,也可以与其他控件一起工作。关于UserControl
,这里有一些特别之处。
public static class BindingExtensions
{
public static Binding BindTo<TControl, TControlProperty, TModel, TModelProperty>(this TControl control, TModel model, Expression<Func<TControl, TControlProperty>> controlProperty, Expression<Func<TModel, TModelProperty>> modelProperty, string format = null)
where TControl : Control
{
var controlPropertyName = ((MemberExpression)controlProperty.Body).Member.Name;
var modelPropertyName = ((MemberExpression)modelProperty.Body).Member.Name;
var formattingEnabled = !string.IsNullOrWhiteSpace(format);
var binding = control.DataBindings.Add(controlPropertyName, model, modelPropertyName, formattingEnabled, DataSourceUpdateMode.OnPropertyChanged);
if (formattingEnabled)
{
binding.FormatString = format;
}
return binding;
}
}