Привязка данных INotifyPropertyChanged не работает должным образом - PullRequest
0 голосов
/ 20 ноября 2018

Я узнаю о привязке данных, особенно с DataGrid.В моем коде у меня есть DataGrid и Label, которые показывают значение первой ячейки DataGrid.Выход XAML выглядит как this.Учитывая изображение ниже, содержимое метки рядом с Значение первой ячейки равно: Обезьяна , которую, я думаю, я получил из первой ячейки DataGrid.Теперь я хотел обновить слева от Значение первой ячейки: , когда я изменяю значение в моей первой ячейке DataGrid.Но я не могу этого достичь.

Ниже - мой Код и файл XAML

КОД

namespace DataGridExampleSelfTry
{
    public class MainWindowVM:INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged = (sender, e) => { };
        private string _FirstCell;

        public string FirstCell
        {
            get{ return _FirstCell; }

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

        }
        public string SecondCell { get; set; }

        private ObservableCollection<animies> _animelistforbinding;
        public ObservableCollection<animies> animelistforbinding
        { get
            {
                return _animelistforbinding;
            }
          set
            {
                _animelistforbinding = value;
                PropertyChanged(this, new PropertyChangedEventArgs(nameof(animelistforbinding)));
            }
        }
        ObservableCollection<animies> addinganime = new ObservableCollection<animies>();

        public MainWindowVM()
        {
            addinganime.Add(new animies("Monkey", "D Luffy"));

            animelistforbinding = addinganime;

            FirstCell = animelistforbinding[0].FirstName;
            SecondCell = animelistforbinding[0].LastName;   
        }     
    }

    public class animies:INotifyPropertyChanged
    {
        private string _FirstName;

        public event PropertyChangedEventHandler PropertyChanged = (sender, e) => { };

        public string FirstName
        {
            get { return _FirstName; }
            set
            {
                _FirstName = value;
                PropertyChanged(this, new PropertyChangedEventArgs(nameof(FirstName)));
            }
        }
        public string LastName { get; set; }
        public animies(string dFirstName, string dLastName)
        {
            FirstName = dFirstName;
            LastName = dLastName;
        }
    }
}

XAML

<Window x:Class="DataGridExampleSelfTry.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:DataGridExampleSelfTry"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="450">
    <Window.DataContext>
        <local:MainWindowVM/>
    </Window.DataContext>
    <StackPanel>
        <DataGrid x:Name="XAML_DataGrid"  
                            AutoGenerateColumns="False"  CanUserAddRows="False"                               
                            ItemsSource="{Binding animelistforbinding}" Margin="5" 
                            CanUserSortColumns="False" HorizontalGridLinesBrush="Gray" 
                            VerticalGridLinesBrush="Gray" >
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding FirstName, NotifyOnTargetUpdated=True, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
                                    Header="First name" Width="*" IsReadOnly="False"/>
                <DataGridTextColumn Binding="{Binding LastName}" Header="Last Name" Width="*" IsReadOnly="False"/>
               
            </DataGrid.Columns>
        </DataGrid>
        <StackPanel Orientation="Horizontal">
            <Label Content="The First Cell Value is : "/>
            <Label Content="{ Binding FirstCell}"/>
        </StackPanel>
        <StackPanel Orientation="Horizontal">
            <Label Content="The Second Cell Value is : "/>
            <Label Content="{ Binding SecondCell}"/>
        </StackPanel>
          <Button Content="Button" Margin="50"/>
    </StackPanel>
   
</Window>

Спасибо за вашу помощь.

1 Ответ

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

Либо привязывать напрямую к тому же свойству, к которому привязан первый столбец DataGrid:

<Label Content="{Binding animelistforbinding[0].FirstName}"/>

..., либо устанавливать свойство FirstCell всякий раз, когда свойство FirstName объектапервый элемент в animelistforbinding установлен.Это можно сделать, обработав событие PropertyChanged для первого элемента модели представления:

public MainWindowVM()
{
    addinganime.Add(new animies("Monkey", "D Luffy"));

    animelistforbinding = addinganime;

    FirstCell = animelistforbinding[0].FirstName;
    SecondCell = animelistforbinding[0].LastName;
    animelistforbinding[0].PropertyChanged += (s, e) => FirstCell = animelistforbinding[0].FirstName;
}
...