我在C#Winforms应用程序中使用了BindingNavigator。
如果bindingSource中没有记录,我希望禁用表单中的字段。 为此,我将字段放在面板上,并希望使用类似
的内容绑定面板的enabled属性this.panel1.DataBindings.Add(new Binding("Enabled", this, "HasRecord", false, DataSourceUpdateMode.OnPropertyChanged));
this.bindingSource1.AddingNew += this.BindingSourceListAddingNew<Person>;
在表单加载事件中。
我在表单上实现了INotifyPropertyChanged并设置了一个HasRecord属性,当单击添加新按钮时会调用该属性
但是,我似乎无法找到一个属性,当单击“添加”按钮时,该属性将返回true。 以下是表单中的方法。
我的问题是,如何让HasRecord属性工作? 我可以添加一个模块宽的布尔变量并将其设置在BindingSourceAddingNew中,但这看起来像是一个黑客。
public bool HasRecord { get
{
return this.bindingSource1.Count > 0;
} }
public override void BindingSourceListAddingNew<T>(object sender, AddingNewEventArgs e)
{
base.BindingSourceListAddingNew<T>(sender, e);
this.SendChange("HasRecord");
Debug.Print( this.bindingSource1.SupportsChangeNotification.ToString());
}
答案 0 :(得分:1)
部分问题似乎与bindingSource1.Count有关,直到在调用AddingNew方法之后才会更新。即,您添加的第一个记录仍会导致HasRecord返回0,因此在添加第二个记录之前,面板不会启用。相反,在绑定源上使用ListChanged事件似乎可以解决这个问题。
使用以下代码会导致面板在加载时被禁用,然后在将记录添加到bindingSource1到button1_Click时立即启用。你仍然需要手动提升PropertyChanged,我不确定你是否试图避免这种情况。
public partial class Form1 : Form , INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
public Form1()
{
InitializeComponent();
}
public bool HasRecord
{
get
{
return this.bindingSource1.Count > 0;
}
}
private void button1_Click(object sender, EventArgs e)
{
bindingSource1.AddNew();
}
private void Form1_Load(object sender, EventArgs e)
{
this.panel1.DataBindings.Add(new Binding("Enabled", this, "HasRecord", false, DataSourceUpdateMode.OnPropertyChanged));
}
private void bindingSource1_ListChanged(object sender, ListChangedEventArgs e)
{
// Notify
OnPropertyChanged("HasRecord");
}
}