Как заставить привязку данных работать с Eto.Forms Gridview - PullRequest
0 голосов
/ 16 октября 2018

Я работаю над созданием приложения, которое отображает состояние многих процессов в виде сетки.Я столкнулся с проблемой, когда представление сетки не «автоматически» обновляло строки, когда обновлялись данные объектов, которые они представляют.Насколько я понимаю из документации 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));
        }
    }
}
...