Я создал небольшое примерное приложение в 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, но, к сожалению, это тоже не сработало, и поэтому я удалил его из этого примера приложения.
Может кто-нибудь дать мне совет, как решить описанную выше проблему?