включить поля в форме при нажатии кнопки bindnavigator добавить новый

Я использую BindingNavigator в своем приложении Winforms на С#.

Я хочу, чтобы поля в моей форме были отключены, если в bindingSource нет записей. Для этого я поместил поля на панель и хочу связать включенное свойство панели, используя что-то вроде

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());

    }

person Kirsten Greed    schedule 02.06.2014    source источник


Ответы (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");
    }

}
person Gareth    schedule 09.06.2014