Показать переменные объекта в DataGrid на основе SelectedItem в другой DataGrid - PullRequest
0 голосов
/ 02 июля 2018

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

  • Первая DataGrid связана с моей собственной коллекцией ObservableCollection. Person-Objects, и он показывает только одно свойство каждого Person-Object.
  • Во второй DataGrid я хочу показать все личные данные на основе выбранный элемент в моей первой DataGrid.

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

Так вот, что я получил в своем DGUpdate-приложении:

Главное окно с обоими сетками данных, DataContext и т. Д.: * 10101 *

<Window x:Class="DGUpdate.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:DGUpdate"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.DataContext>
        <local:MainWindow_ViewModel/>
    </Window.DataContext>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <DataGrid
            Grid.Column="0"
            ItemsSource="{Binding MyObeservableCollectionOfPerson}" 
            SelectedItem="{Binding Path=SelectedPerson, Mode=TwoWay}"
            AutoGenerateColumns="False"
            IsReadOnly="True">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Last name" Width="Auto" Binding="{Binding LastName}"/>
            </DataGrid.Columns>
        </DataGrid>
        <DataGrid
            Grid.Column="1"
            ItemsSource="{Binding SelectedPerson}" 
            AutoGenerateColumns="False"
            IsReadOnly="True">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Last name" Width="Auto" Binding="{Binding SelectedPerson.LastName}"/>
                <DataGridTextColumn Header="First name" Width="Auto" Binding="{Binding SelectedPerson.FirstName}"/>
                <DataGridTextColumn Header="Age" Width="Auto" Binding="{Binding SelectedPerson.Age}"/>
                <DataGridTextColumn Header="Weight" Width="Auto" Binding="{Binding SelectedPerson.Weight}"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

Моя ViewModel, которая также реализует INotifyPropertyChanged и где я создаю двух демо-персон в Конструкторе:

using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;

namespace DGUpdate
{
    public class MainWindow_ViewModel : INotifyPropertyChanged
    {
        #region Properties
        public ObservableCollection<Person_Model> MyObeservableCollectionOfPerson { get; set; }
        public Person_Model SelectedPerson { get; set; }
        #endregion

        #region Constructor
        public MainWindow_ViewModel()
        {
            MyObeservableCollectionOfPerson = new ObservableCollection<Person_Model>();

            MyObeservableCollectionOfPerson.Add(
                new Person_Model()
                {
                    LastName = "Doe",
                    FirstName = "John",
                    Age = 32,
                    Weight = 90.3
                });
            MyObeservableCollectionOfPerson.Add(
                new Person_Model()
                {
                    LastName = "Miller",
                    FirstName = "Peter",
                    Age = 41,
                    Weight = 75.7
                });
        }
        #endregion

        #region INotifyPropertyChanged
        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
        #endregion
    }
}

Мой личный класс с четырьмя свойствами, которые я хочу отображать во второй DataGrid на основе лица, выбранного в моей первой DataGrid:

namespace DGUpdate
{
    public class Person_Model
    {
        public string LastName { get; set; }
        public string FirstName { get; set; }
        public int Age { get; set; }
        public double Weight { get; set; }
    }
}

Как вы можете видеть, в моем ViewModel-Class я создал Person-Object 'SelectedPerson', который связан с SelectedItem моей первой DataGrid и который я использую в качестве ItemSource моей второй DataGrid. Я также немного поиграл с ручным вызовом NotifyPropertyChanged, но, к сожалению, это тоже не сработало, и поэтому я удалил его из этого примера приложения.

Может кто-нибудь дать мне совет, как решить описанную выше проблему?

1 Ответ

0 голосов
/ 03 июля 2018

Вы должны позвонить NotifyPropertyChanged() в вашей собственности, как это:

private Person_Model selectedPerson;

public Person_Model SelectedPerson { 
  get
  {
    return this.selectedPerson;
  }

  set
  {
    if (value != this.selectedPerson)
    {
      this.selectedPerson = value;
      NotifyPropertyChanged();
    }
  }
}

Подробнее о документе: https://docs.microsoft.com/fr-fr/dotnet/framework/winforms/how-to-implement-the-inotifypropertychanged-interface

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...