如何在多个面板中显示对象?

时间:2010-09-08 22:16:57

标签: c# winforms

我想知道如何在多个面板中使用自定义对象。

我创建了一个panelModified对象(从Panel扩展),并希望将其放在两个普通面板中,因此当对象更改其状态时,两个面板都会显示更新的信息。

在我的情况下,“panelModified”是一个包含一些按钮和嵌入视频的面板。

以下是代码:

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

panel1.Controls.Add(panelPreview);

panel2.Controls.Add(panelPreview);

它只显示在面板2中:(

2 个答案:

答案 0 :(得分:3)

您不能将相同的控件放在两个不同的位置。

这里的解决方案是创建一个“模型”对象,其中包含可以更改的所有信息。然后创建两个指向同一模型的PanelPreview副本。

您的模型应该实现INotifyPropertyChanged,以便它可以告诉面板何时发生了变化。

出于您的目的,“模​​型”与“业务对象”或“数据对象”是相同的。

答案 1 :(得分:1)

您展示的自定义对象必须能够通知它的值正在发生变化(即实现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);