Как иметь привязываемые свойства UserControl, которые работают с OnPropertyChanged

У меня есть простой пользовательский элемент управления (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?

10
задан Igby Largeman 6 July 2011 в 15:10
поделиться