【问题标题】:Binding in User Controls用户控件中的绑定
【发布时间】:2013-06-17 22:41:59
【问题描述】:

假设我有这段代码(在 Winforms 中):

public class SomeClass
{
    public string Name { get; set; }
}

public partial class SomeControl : UserControl
{
    private SomeClass inClass;

    public string MyName { get; set; }

    public SomeControl(SomeClass someClass)
    {
        InitializeComponent();

        this.inClass = someClass;

        SetupBinding();
    }

    private void SetupBinding()
    {
        this.DataBindings.Clear();
        this.DataBindings.Add("MyName", this.inClass, "Name");
    }
}

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

谢谢

【问题讨论】:

  • A UserControlForm 工作正常(双向)但 UserControl 与另一个 UserControl 不起作用。这有点奇怪,因为UserControl 继承自实现IBindableComponentControl,我可以创建自己的可绑定组件,它可以与其他控件一起使用,也可以与其他控件一起使用。 UserControl 有一些特别之处。

标签: c# .net winforms binding user-controls


【解决方案1】:
如果您想要双向数据绑定,

SomeClass 必须 impelement INotifyPropertyChanged 或具有名为 NameChanged 的事件。你可以自己实现,但我强烈推荐Fody.PropertyChanged 项目。

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

【讨论】:

    猜你喜欢
    • 2012-06-20
    • 2023-03-16
    • 2014-01-14
    • 2011-07-09
    • 2016-01-17
    • 2010-12-20
    • 1970-01-01
    相关资源
    最近更新 更多