У меня есть простой пользовательский элемент управления (WinForms) с некоторыми общедоступными свойствами. Когда я использую этот элемент управления, я хочу привязать данные к этим свойствам с DataSourceUpdateMode, установленным на OnPropertyChanged . Источник данных - это класс, реализующий INotifyPropertyChanged.
Я знаю о необходимости создавать привязки к свойствам, и я это делаю.
Я предположил, что мой пользовательский элемент управления должен реализовывать интерфейс, или свойства должны быть украшены каким-либо атрибутом или чем-то в этом роде.Но мое исследование оказалось пустым.
Как это должно быть достигнуто? В настоящий момент я делаю это, вызывая OnValidating () в своем пользовательском элементе управления всякий раз, когда изменяется свойство, но это не кажется правильным.
Я могу получить подтверждение, если установлю для CausesValidation значение true в пользовательском элементе управления, но для меня это не очень полезно. Мне нужно проверять каждое дочернее свойство по мере его изменения.
Обратите внимание, что это ситуация 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 () в пользовательском элементе управления после изменения свойства. Если я этого не сделаю, мне придется подождать, пока проверка не активируется изменением фокуса, что является эквивалентом режима обновления «OnValidation», а не желаемого режима проверки «OnPropertyUpdate». Мне просто не хочется, чтобы вызов OnValidating () после изменения значения свойства был правильным, даже если он (вроде) работает.
Правильно ли я предполагаю, что вызов OnValidating () не как это сделать? Если да, как мне уведомить источник данных об изменении ControlProperty?