Я работаю над созданием приложения, которое отображает состояние многих процессов в виде сетки.Я столкнулся с проблемой, когда представление сетки не «автоматически» обновляло строки, когда обновлялись данные объектов, которые они представляют.Насколько я понимаю из документации Eto.Forms по DataBinding, если объект реализует интерфейс INotifyPropertyChanged
, то сетка автоматически обновит поля объекта, когда они изменятся (при условии, что они действительно уведомляют).
Я создал следующий проект для тестирования и обнаружил, что столбцы обновляются только тогда, когда я либо A) наведите курсор мыши, B) нажмите или C) нажмите клавишу в строке.
Ниже приведены мои настройки теста.Это так просто, как я могу это получить.
Как мне заставить gridview автоматически обновляться при изменении свойства элемента?
using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Timers;
using Eto.Forms;
//using Testing.Annotations;
namespace Testing
{
internal class Program
{
[STAThread]
public static void Main(string[] args)
{
new Application().Run(new TestForm());
}
}
public class TestForm : Form
{
public TestForm()
{
var gridView = new GridView<TestObj>();
gridView.Columns.Add(new GridColumn
{
HeaderText = "Test Field",
DataCell = new TextBoxCell {Binding = Binding.Property<TestObj, string>(item => item.TestField)}
});
Content = gridView;
var objects = new ObservableCollection<TestObj>
{
new TestObj(),
new TestObj(),
new TestObj()
};
gridView.DataStore = objects;
}
}
public class TestObj : INotifyPropertyChanged
{
private string _testField;
public string TestField
{
get => _testField;
set
{
if (value != _testField)
{
_testField = value;
OnPropertyChanged();
}
}
}
public TestObj()
{
var timer = new Timer(500);
var r = new Random();
timer.Elapsed += (sender, args) => TestField = r.Next().ToString();
timer.Start();
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}