C# 用户控件中的绑定

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

假设我有以下代码(在Winforms中):

如果在用户控件之外更改SomeClass.Name的值,则MyName属性永远不会更改。我做错了什么


谢谢你

如果你想要双向数据绑定,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=格式;
}
返回绑定;
}
}

A
UserControl
vs
Form
工作正常(双向),但是A
UserControl
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;
    }
}