Пользовательский элемент управления с привязкой к данным с обновлением данных при изменении - PullRequest
1 голос
/ 10 марта 2010

У меня есть вопрос, связанный с привязкой данных

Если у нас есть класс A с некоторым свойством, например, «UserName», и текстовый элемент управления T1 связан следующим образом:

T1.DataBindings.Add("Text",A,"UserName",true,DataSourceUpdateMode.OnPropertyChanged); 

т.е. свойство будет обновлено, когда пользователь отредактирует текст

Теперь, если вместо текстового поля у нас есть пользовательский элемент управления C1 со свойством элемента управления «ControlProp» (например, типа MyEnum) и он привязан к классу B со свойством MyProp типа MyEnum следующим образом:

C1.DataBindings.Add("ControlProp ",B," MyProp",true,DataSourceUpdateMode.OnPropertyChanged); 

Вопрос: как можно обеспечить поведение настраиваемого элемента управления, аналогичное текстовому полю, описанному выше, то есть свойство класса B будет обновляться при изменении ControlProp? Ваша помощь будет очень ценной. Танки

Ответы [ 2 ]

1 голос
/ 10 марта 2010

Во-первых, ваш класс B должен реализовать интерфейс INotifyPropertyChanged . Это полный код или класс B

public class ClassB : System.ComponentModel.INotifyPropertyChanged
{
    private string myprop;

    public string MyProp
    {
    get
    {
        return myprop;
    }
    set
    {
        if (value != myprop)
        {
        myprop = value;
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs("MyProp"));
        }


        }


    }
    }

    #region INotifyPropertyChanged Members

    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;

    #endregion

}

Затем предположим, что внутри вашего пользовательского элемента управления есть метка, и вы хотите связать текст метки с экземпляром класса B. Например:

public partial class MyCustomControl : UserControl
{
    public MyCustomControl()
    {
        InitializeComponent();
    }

    public string MyCustomProperty
    {
        get
        {
            return label1.Text;
        }
        set
        {
            label1.Text = value;
        }
    }
}

Если вы связываете свойство MyProp класса B с MyCustomProperty вашего пользовательского элемента управления, то при изменении свойства вашего объекта label1 должен изменить его текст.

    ClassB objectB = new ClassB();

    C1.DataBindings.Add("MyCustomProperty", objectB, "MyProp", true, DataSourceUpdateMode.OnPropertyChanged);

    objectB.MyProp = "Text 1";
    objectB.MyProp = "Text 2";

    // The final text is Text2
0 голосов
/ 11 марта 2010

Я думаю, что нашел решение: добавлен Inotifypropertychange к определению элемента управления: открытый частичный класс MyCustomControl: UserControl, INotifyPropertyChanged И в установщике свойств элементов управления я поднимаю событие (как в примере Хавьера Морилло)

Спасибо всем

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...