[英]Binding in User Controls
let's say I've got this code (in Winforms): 假设我有以下代码(在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");
}
}
If I'll change the the value of SomeClass.Name outside the user control, the property MyName never changes. 如果要在用户控件之外更改SomeClass.Name的值,则MyName属性将永远不会更改。 What am I doing wrong?
我究竟做错了什么?
Thank you 谢谢
SomeClass must impelement INotifyPropertyChanged or have event named NameChanged if you want bidirectional data binding. 如果要进行双向数据绑定, SomeClass必须使用INotifyPropertyChanged或具有名为NameChanged的事件。 You can implement it yourself, but I highly recommend Fody.PropertyChanged project.
您可以自己实现它,但我强烈建议Fody.PropertyChanged项目。
PS: I wrote some extension method to create binding more easier and refactoring friendly way. PS:我写了一些扩展方法来创建绑定更容易和重构的友好方式。 In your case it would look like this:
在您的情况下,它看起来像这样:
this.BindTo(inClass, c => c.MyName , m => m.Name);
The method itself: 方法本身:
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;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.