У меня есть сетка данных
<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.
Что могло не хватать? Не обращайте внимания на опечатки, я просто вырезал нужные фрагменты вручную.
MyMethodThatShouldBeCalled (); никогда не называется.
Куда вы пытаетесь назначить список?
Извините, я не понимаю?
Вы должны где-то сделать назначение типа MyList = new <MyObjectINotifyImplemented>() { new MyObjectINotifyImplemented() }. Пока это назначение не произойдет, вызов MyMethodThatShouldBeCalled не будет выполняться. Где-то должно быть присвоение, иначе ссылка на MyList останется пустой.
Ой, извините, это в конструкторе.





Измените определение MyList с List<MyObjectINotifyImplemented> на ObservableCollection<MyObjectINotifyImplemented>, которое вы вводите в конструктор.
Ах, опечатка. Я пробовал оба, это была ошибка C&P из последней попытки.
Приносим извинения за негативное отношение к вашей проблеме, но это следует сделать только один раз. Это единственное место, где вы действительно загружаете список. Если в форме нет чего-то еще, что заставит обновить и запросить ваши данные, например, из вашей строки подключения / базы данных, этого не произойдет. Все, что у вас есть, это
Вы предоставили множество частичных реализаций, но, очевидно, недостаточно, чтобы передать остальную функциональность.
Не нужно извиняться, спасибо за чтение. Я добавил код, он просто заполняется данными по умолчанию. Привязка назад к началу работает нормально, но другой способ не работает.
Most questions are resolved by binding mode or adding
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 исходной коллекции. Сама коллекция не будет заменена.
Итак, если я правильно вас понял, DataGrid не поддерживает двустороннюю привязку? Потому что я нахожу сотни вопросов о переполнении стека с просьбой настроить это, большинство из которых имеют успешный результат. Я тоже не вижу ничего подобного в документах Microsoft, где бы искать? Коллекция List <> или Observable получена из базы данных SQLite. Что я хотел бы сделать, так это записать в БД при обновлении одной из строк, что и должна обрабатывать MyMethodThatShouldBeCalled (). Я посмотрю на событие CollectionChanged, ура.
@ArchieMoses: когда свойство объекта, представленного строкой, обновляется, вызывается установщик этого свойства. В вашем примере это свойство Name. Но свойство исходной коллекции не изменяется.
В чем именно проблема, похоже, у вас есть изменение данных, которого вы не видите? Или привязка вообще не отображается?