我刚用以下代码创建了一个控件:
public partial class KindsEditor : NaviGroupList, INotifyPropertyChanged
{
private WebBrowser _Browser;
private BasicProject _Project;
public event PropertyChangedEventHandler PropertyChanged;
public bool RequiredDataLoaded { get { return (Project != null) && (Browser != null); } }
private bool _ButtonsEnabled = false;
public bool ButtonsEnabled { set { SetButtonsEnabled(value); } get { return _ButtonsEnabled; } }
public WebBrowser Browser
{
get { return _Browser; }
set
{
_Browser = value;
OnPropertyChanged(new PropertyChangedEventArgs("Browser"));
OnPropertyChanged(new PropertyChangedEventArgs("RequiredDataLoaded"));
}
}
public BasicProject Project
{
get { return null; }
set { LoadProject(value); }
}
public KindsEditor()
{
InitializeComponent();
DataBindings.Add("ButtonsEnabled", this, "RequiredDataLoaded");
}
private void SetButtonsEnabled(bool value)
{
newKindButton.Enabled = value;
_ButtonsEnabled = value;
OnPropertyChanged(new PropertyChangedEventArgs("ButtonsEnabled"));
}
protected void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (PropertyChanged != null) PropertyChanged(this, e);
}
private void LoadProject(BasicProject value)
{
if (value != null) DataSource = value.Kinds;
_Project = value;
OnPropertyChanged(new PropertyChangedEventArgs("Project"));
OnPropertyChanged(new PropertyChangedEventArgs("RequiredDataLoaded"));
}
}
我删除了一些我认为与我的问题无关的东西。我试图绑定一个启用的按钮(newKindButton
),使两个属性(Browser
和Project
)不为空。我知道它很混乱,没有人会期望我在改变不同的属性和其他可能不应该做的事情时调用OnPropertyChanged
。我稍后会解决这个问题。但奇怪的是,使用此控件的Form
(我将其从工具箱中拖放)将此行添加到InitializeComponent()
自动生成的代码中:
this.kindsEditor1.DataBindings.Add(new System.Windows.Forms.Binding("ButtonsEnabled", this.kindsEditor1, "RequiredDataLoaded", true));
因此,当我尝试运行应用程序时,我得到一个异常,告诉我这行正在尝试绑定到同一属性两次。我发誓,我从未在属性面板中添加任何绑定。如果我删除该行
DataBindings.Add("ButtonsEnabled", this, "RequiredDataLoaded");
来自KindsEditor
的构造函数,自动生成的行消失。谁知道发生了什么?
答案 0 :(得分:1)
尝试在绑定周围添加DesignerProperties.GetIsInDesignMode
:
public KindsEditor()
{
InitializeComponent();
if (!DesignerProperties.GetIsInDesignMode(this))
DataBindings.Add("ButtonsEnabled", this, "RequiredDataLoaded");
}
我没有直接答案,但我怀疑Visual Studio认为它不需要序列化某些内容(生成的代码)。上面的构造隐藏了Visual Studio的绑定,只在运行时激活它。