我想知道如何在多个面板中使用自定义对象。
我创建了一个panelModified对象(从Panel扩展),并希望将其放在两个普通面板中,因此当对象更改其状态时,两个面板都会显示更新的信息。
在我的情况下,“panelModified”是一个包含一些按钮和嵌入视频的面板。
以下是代码:
panelPreview = new PanelPreview(file); (panelModified object)
panel1.Controls.Add(panelPreview);
panel2.Controls.Add(panelPreview);
它只显示在面板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);