Уведомление об изменении свойства для свойства структуры, DataGrid, Binding, INotifyPropertyChanged, Изменение значения строки списка - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть struct имя точки данных , у которых есть свойство (int x и строка y), и конструктор принимает целое число и строку для присвоения их значения.Я также сделал observablecollection этой структуры точек данных .При создании коллекции я передал строковые свойства FirstCell и SecondCell в первый и второй список, и эти FirstCell и SecondCell являются свойством, в котором реализовано изменение свойства Inotify.Теперь, когда я изменяю этот FirstCell и SecondCell, они не изменяются в сетке данных.

Ниже приведен мой код для файла MainWindow.xaml.cs

public partial class MainWindow : Window,INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged = (sender, e) => { };
        private string _FirstCell="LUFFY";
        private string _SecondCell= "SANJI";
        public string FirstCell
        {
            get { return _FirstCell; }

            set
            {
                _FirstCell = value;
                PropertyChanged(this, new PropertyChangedEventArgs(nameof(FirstCell)));
            }

        }
        public string SecondCell
        {
            get { return _SecondCell; }

            set
            {
                _SecondCell = value;
                PropertyChanged(this, new PropertyChangedEventArgs(nameof(SecondCell)));
            }
        }

        private ObservableCollection<datapoints> _CheckNotifyUpdate;
        public ObservableCollection<datapoints> CheckNotifyUpdate
        {
            get { return _CheckNotifyUpdate; }

            set
            {
                _CheckNotifyUpdate = value;
                PropertyChanged(this, new PropertyChangedEventArgs(nameof(CheckNotifyUpdate)));
            }
        }

        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = this;
       
            CheckNotifyUpdate = new ObservableCollection<datapoints>
            {
                new datapoints(1, FirstCell),
                new datapoints(2, SecondCell)
            };
        }
    } 

    public struct datapoints
    {
        public int x { get; set; }    
        public string y { get; set; }

        public datapoints(int X,string Y)
           
        {
              x = X;
              y = Y;
        }
    }

Это мой XAML-файл

<Window x:Class="InotifyClassPropInsideList.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:InotifyClassPropInsideList"
        mc:Ignorable="d"
        d:DataContext="{d:DesignInstance Type=local:MainWindow, IsDesignTimeCreatable=True}"
        Title="MainWindow" Height="450" Width="400">

    <StackPanel>
        <TextBox Text="{Binding FirstCell}" Margin="10"/>
        <TextBox Text="{Binding SecondCell}"  Margin="10"/>
        <StackPanel Orientation="Horizontal">
                <Label Content="The First Cell Value (Y1 in DataGrid) is : "/>
                <Label Content="{ Binding FirstCell}"/>
            </StackPanel>
            <StackPanel Orientation="Horizontal">
            <Label Content="The Second Cell Value is (Y2 in DataGrid) : "/>
                <Label Content="{ Binding SecondCell}"/>
            </StackPanel>
            <Button Content="Button" Margin="50"/>
        <DataGrid  SelectedIndex="{Binding SelectedDataIndex, Mode=TwoWay}"
                   ItemsSource="{Binding CheckNotifyUpdate }" AutoGenerateColumns="True"
                   HorizontalAlignment="Center"></DataGrid>
    </StackPanel>

</Window>

Токовый выход подобен этому enter image description here

Я проверил, реализован ли InotifyPropertychanged или нетпроверка их значения в метке ниже, и она обновляется соответственно, но сетка данных не обновляется.Например, если я изменяю значение luffy и записываю Zoro в первое текстовое поле, то первая метка в выводе (Значение первой ячейки (Y1 в DataGrid равно): Zoro, но вывод в первой строке таблицы Y по-прежнему LUFFY.

PS. Я пишу эту программу для имитации своей ситуации, когда пытаюсь использовать точки данных из OxyPlot, поэтому я должен использовать struct и не могу использовать класс для точек данных .

1 Ответ

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

Я изменил структуру на класс, и все работает, но поскольку ваши данные поступают в виде структуры, я думаю, что приведенное ниже решение подойдет вам.

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

    public partial class MainWindow : Window, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged = (sender, e) => { };
    private string _FirstCell = "LUFFY";
    private string _SecondCell = "SANJI";
    public string FirstCell
    {
        get { return _FirstCell; }

        set
        {
            _FirstCell = value;
            PropertyChanged(this, new PropertyChangedEventArgs(nameof(FirstCell)));
            RefreshGrid();
        }

    }
    public string SecondCell
    {
        get { return _SecondCell; }

        set
        {
            _SecondCell = value;
            PropertyChanged(this, new PropertyChangedEventArgs(nameof(SecondCell)));
            RefreshGrid();
        }
    }

    private ObservableCollection<datapoints> _CheckNotifyUpdate;
    public ObservableCollection<datapoints> CheckNotifyUpdate
    {
        get { return _CheckNotifyUpdate; }

        set
        {
            _CheckNotifyUpdate = value;
            PropertyChanged(this, new PropertyChangedEventArgs(nameof(CheckNotifyUpdate)));

        }
    }

    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;
        RefreshGrid();
    }

    private void RefreshGrid()
    {
        CheckNotifyUpdate = new ObservableCollection<datapoints>
        {
            new datapoints(1, FirstCell),
            new datapoints(2, SecondCell)
        };
    }
}

public struct datapoints
{
    public int x { get; set; }
    public string y { get; set; }

    public datapoints(int X, string Y)

    {
        x = X;
        y = Y;
    }
}

Измените его для создания Коллекции каждый раз, когда происходит изменение значения ячейки.

...