WPF: обнаружение изменений в Datagrid - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть сетка данных

<DataGrid ItemsSource="{Binding MyList, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
  <DataGrid.Columns>
    <DataGridTextColumn Header="Name"
                                Binding="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
  </DataGrid.Columns>
</DataGrid>

Это источник

    /*** Added constructor ***/
    public SetupVM()
    {
        ConnectionString = Path.Combine(DATABASE_PATH, DATABASE_NAME);
        MyList = new List<MyObjectINotifyImplemented>();

        /* MyList= new ObservableCollection<MyObjectINotifyImplemented>(); */

        if (!File.Exists(ConnectionString))
        {
            FirstRun();
        }
    }

    public void FirstRun()
    {
        BoilerPlate boilerPlate = new BoilerPlate();
        Directory.CreateDirectory(DATABASE_PATH + "\\databaseFile");

        using (SQLiteConnection conn = new SQLiteConnection(ConnectionString))
        {
            conn.CreateTable<MyObjectINotifyImplemented>();

            foreach (seed in MyObjectINotifyImplemented.seeds)
            {
                var t = conn.Insert(seed);
            }
        }
    }

    private List<MyObjectINotifyImplemented> _mylist;

    public List<MyObjectINotifyImplemented> MyList
    {
        get { return _mylist; }
        set
        {
            _mylist= value;
            /****  Called on initialization in ctor and never again ****/
            MyMethodThatShouldBeCalled();
        }
    }

Образец модели:

class MyObjectINotifyImplemented : INotifyPropertyChanged
{
  [PrimaryKey, AutoIncrement]
  public int Id { get; set; }
  private string _name;

  public string Name
  {
    get { return _name; }
    set
    {
      _name = value;
      OnPropertyChanged("Name");
    }
  }

  /** Generated by VS **/
  public event PropertyChangedEventHandler PropertyChanged;

  [NotifyPropertyChangedInvocator]
  protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
  {
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
  }
}

Я вижу, что этот вопрос задают снова и снова, но я реализую все, что могу найти?

Большинство вопросов решаются с помощью режима привязки или добавления UpdateSourceTrigger = PropertyChanged.

Чего не хватает? Не обращайте внимания на опечатки, я просто вырезал соответствующие биты вручную.

Ответы [ 3 ]

0 голосов
/ 06 ноября 2018

Извините, что звучу негативно по вашей проблеме, но ее следует вызывать только один раз. Это единственное место, где вы на самом деле загружаете список. Если в форме нет чего-то еще, что заставит вас обновить данные и запросить их, например, из строки / базы данных, это не произойдет. Все, что у вас есть

  1. Подготовить пустой список (это должно быть ObservableCollection)
  2. Определите вашу сетку данных (но все равно ничего, что указывает на то, что формы DataContext фактически установлены)
  3. Ваш файл отсутствует в зависимости от настроек connectionString, вы вызываете FirstRun, но не показывает, что делает FirstRun.
  4. Если ожидаемый файл существует, он не показывает, что вы запрашиваете что-либо для его заполнения.

Вы предоставили множество частичных реализаций, но, очевидно, этого недостаточно, чтобы получить доступ ко всем остальным функциям.

0 голосов
/ 06 ноября 2018

Большинство вопросов решаются с помощью режима привязки или добавления UpdateSourceTrigger=PropertyChanged.

Имеет смысл устанавливать свойства UpdateSourceTrigger и Mode, когда элемент управления фактически может устанавливать свойство источника. DataGrid не не устанавливает источник свойства ItemsSource, поэтому установка этих свойств в этом контексте не имеет смысла.

DataGrid никогда не вызовет установщик вашего MyList исходного свойства. Будет назван только получатель. Это ожидаемое поведение. Вы должны определить привязку следующим образом:

<DataGrid ItemsSource="{Binding MyList}">

Если вы, например, связываете свойство Text TextBox, имеет смысл указать UpdateSourceTrigger и Mode для управления, когда и если TextBox устанавливает свойство источника. Но это не так при связывании свойства ItemsSource ItemsControl.

Неясно, почему вы ожидаете или хотите, чтобы установщик свойства исходной коллекции вызывался здесь фреймворком, потому что он не должен этого делать. И не будет.

Если вы хотите обнаружить элементы, добавляемые или удаляемые из DataGrid, вам следует заменить List<MyObjectINotifyImplemented> на ObservableCollection<MyObjectINotifyImplemented> и обработать событие CollectionChanged в исходной коллекции. Сама коллекция не будет заменена.

0 голосов
/ 05 ноября 2018

Измените определение MyList с List<MyObjectINotifyImplemented> на ObservableCollection<MyObjectINotifyImplemented>, которое вы обновляете в конструкторе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...