У меня есть простой пользовательский контроль (WinForms) с некоторыми общедоступными свойствами. Когда я использую этот элемент управления, я хочу привязать данные к этим свойствам с DataSourceUpdateMode, установленным в OnPropertyChanged . Источником данных является класс, который реализует INotifyPropertyChanged.
Я осознаю необходимость создания привязок к свойствам, и я делаю это.
Я предполагал, что в моем пользовательском контроле должен быть реализован интерфейс, или свойства должны быть украшены каким-либо атрибутом или чем-то в этом роде. Но мое исследование оказалось пустым.
Как это сделать? В настоящий момент я делаю это, вызывая OnValidating () в моем usercontrol всякий раз, когда свойство изменяется, но это кажется неправильным.
Я могу получить подтверждение, если я установлю для CausesValidation значение true в usercontrol, но это не очень полезно для меня. Мне нужно проверить каждое дочернее свойство по мере его изменения.
Обратите внимание, что это WinForms ситуация.
РЕДАКТИРОВАТЬ: Очевидно, у меня нет таланта для объяснения, так что, надеюсь, это прояснит, что я делаю. Это сокращенный пример:
// I have a user control
public class MyControl : UserControl
{
// I'm binding to this property
public string ControlProperty { get; set; }
public void DoSomething()
{
// when the property value changes, the change should immediately be applied
// to the bound datasource
ControlProperty = "new value";
// This is how I make it work, but it seems wrong
OnValidating();
}
}
// the class being bound to the usercontrol
public class MyDataSource : INotifyPropertyChanged
{
private string sourceProperty;
public string SourceProperty
{
get { return sourceProperty; }
set
{
if (value != sourceProperty)
{
sourceProperty = value;
NotifyPropertyChanged("SourceProperty");
}
}
}
// boilerplate stuff
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(string info)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
public class MyForm : Form
{
private MyControl myControl;
public MyForm()
{
// create the datasource
var dataSource = new MyDataSource() { SourceProperty = "test" };
// bind a property of the datasource to a property of the usercontrol
myControl.DataBindings.Add("ControlProperty", dataSource, "SourceProperty",
false, DataSourceUpdateMode.OnPropertyChanged); // note the update mode
}
}
(я пробовал это с использованием BindingSource, но результат был тот же.)
Теперь я хочу, чтобы при изменении значения MyControl.ControlProperty это изменение немедленно распространялось на источник данных (экземпляр MyDataSource). Для этого я вызываю OnValidating () в usercontrol после изменения свойства. Если я этого не сделаю, мне придется подождать, пока проверка не будет вызвана изменением фокуса, которое является эквивалентом режима обновления «OnValidation», а не желаемого режима проверки «OnPropertyUpdate». Мне просто не хочется вызывать OnValidating () после изменения значения свойства, это правильно, даже если оно (вроде) работает.
Прав ли я, предполагая, что вызов OnValidating () не является правильным способом сделать это? Если да, то как мне уведомить источник данных об изменении ControlProperty?