Как я могу показать объект на нескольких панелях? - PullRequest
5 голосов
/ 09 сентября 2010

Мне было интересно, как я могу использовать пользовательский объект в более чем одной панели.

Я создал объект panelModified (расширяется от Panel) и хочу разместить его на двух обычных панелях, поэтому при изменении объектаВ своем состоянии обе панели отображают обновленную информацию.

В моем случае «panelModified» - это панель с несколькими кнопками и встроенным видео.

Вот код:

panelPreview = new PanelPreview(file); (panelModified object)

panel1.Controls.Add(panelPreview);

panel2.Controls.Add(panelPreview);

отображается только на панели 2: (

Ответы [ 2 ]

3 голосов
/ 09 сентября 2010

Нельзя использовать один и тот же элемент управления в двух разных местах.

Решением здесь является создание «модельного» объекта, который имеет всю информацию, которая может измениться. Затем вы создаете две копии PanelPreview, которые указывают на одну и ту же модель.

Ваша модель должна реализовывать INotifyPropertyChanged, чтобы она могла сообщить панели, когда что-то изменилось.

Для ваших целей «модель» - это то же самое, что «бизнес-объект» или «объект данных».

1 голос
/ 09 сентября 2010

Ваш пользовательский объект, который вы показываете, должен иметь возможность уведомлять, что его значения меняются (т.е. реализует INotifyPropertyChanged).

Затем вы можете изменить свой PanelPreview для привязки к вашему объекту.

Таким образом, вы можете иметь столько экземпляров, сколько захотите - при изменении одного экземпляра INotifyPropertyChanged запустит отображение на всех остальных.

Например:

public class CustomClass : INotifyPropertyChanged
    {
        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion

        private void OnPropertyChanged(string propName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propName));
            }
        }

        private string mProp;
        public string Prop
        {
            get
            {
                return mProp;
            }
            set
            {
                if (value != mProp)
                {
                    mProp = value;
                    OnPropertyChanged("Prop");
                }
            }
        }
    }

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

CustomClass c = new CustomClass();
textBox1.DataBindings.Add("Text", c, "Prop", true, DataSourceUpdateMode.OnPropertyChanged);
textBox2.DataBindings.Add("Text", c, "Prop", true, DataSourceUpdateMode.OnPropertyChanged);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...