2013-06-20 5 views
0

скажем, у меня есть этот код (в Winforms):Связывание в User Controls

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 никогда не меняется. Что я делаю не так?

Спасибо

+0

'UserControl' В.С.' form' работает нормально (двунаправленным), но 'UserControl' против другого' UserControl' не работает. Это немного странно, потому что 'UserControl' наследует от' Control', который реализует 'IBindableComponent', я могу создать свой собственный связующий компонент, который работает с другими элементами управления и друг с другом. В «UserControl» есть что-то особенное. –

ответ

0

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

Спасибо. Он работает ... реализует только INotifyPropertyChanged ... – vidriduch