Код: Выделить всё
public class PointViewModel : ViewModelBase
{
public string Name
{
get => _name;
set
{
_name = value;
NotifyPropertyChanged(nameof(Name));
}
}
public double X
{
get => _x;
set
{
_x = value;
NotifyPropertyChanged(nameof(X));
}
}
public double Y
{
get => _y;
set
{
_y = value;
NotifyPropertyChanged(nameof(Y));
}
}
public double Z
{
get => _z;
set
{
_z = value;
NotifyPropertyChanged(nameof(Z));
}
}
public ObservableCollection
CustomProperties => _customProperties;
public PointViewModel(string name, double x, double y, double z)
{
// in the real code this collection is empty at the beginning, but for the test I added 2 custom properties where I just "know" their names and values.
_customProperties = new ObservableCollection()
{
new PointCustomPropViewModel("Test Prop 1", "Hello"),
new PointCustomPropViewModel("Test Prop 2", "World"),
};
Name = name;
X = x;
Y = y;
Z = z;
}
private readonly ObservableCollection _customProperties;
private string _name;
private double _x;
private double _y;
private double _z;
}
Код: Выделить всё
public class PointCustomPropViewModel : ViewModelBase
{
public string PropName
{
get => _propName;
set
{
_propName = value;
NotifyPropertyChanged(nameof(PropName));
}
}
public string PropValue
{
get => _propValue;
set
{
_propValue = value;
NotifyPropertyChanged(nameof(PropValue));
}
}
public PointCustomPropViewModel(string propName, string propValue)
{
PropName = propName;
PropValue = propValue;
}
private string _propName;
private string _propValue;
}
Код: Выделить всё
public class MainWindowViewModel : ViewModelBase
{
public ObservableCollection
Points => _points;
public ICollectionView PointsView => _pointsView;
public MainWindowViewModel()
{
_points = new ObservableCollection();
_pointsView = CollectionViewSource.GetDefaultView(_points);
Initialize();
}
private void Initialize()
{
var _random = new Random();
for (int _i = 0; _i < 3; _i++)
{
double _randomX = _random.NextDouble();
double _randomY = _random.NextDouble();
double _randomZ = _random.NextDouble();
_points.Add(new PointViewModel($"Point {_i}", _randomX, _randomY, _randomZ));
}
NotifyPropertyChanged(nameof(PointsView));
}
private readonly ObservableCollection _points;
private readonly ICollectionView _pointsView;
}
Но наш DataGrid должен отображать информацию обо всех точках, включая информацию о пользовательских свойствах с возможностью редактировать значение каждого основного или настраиваемого свойства. Итак, например, у меня есть тестовый код XAML, в котором я создал DataGrid, добавил привязку к ItemSource со свойством PointsView и привязку между четырьмя основными столбцами и основными свойствами в объекте PointViewModel:
Код: Выделить всё

Но как мне создать новые столбцы на основе коллекции с привязкой к свойству Value в коллекции CustomProperties для каждой точки? Например, у моих точек есть новое настраиваемое свойство «Тестовое предложение 1», это свойство имеет значение «Привет». Поэтому мне нужно создать новый столбец с заголовком «Тестовое предложение 1», и каждая строка в этом столбце должна отображать значение соответствующей точки (в данном случае значение будет «Привет»). И когда, например, я пытаюсь отредактировать значение в этом столбце в первой строке и изменить его на «Привет» - он должен найти первый объект в коллекции Points, найти объект PointCustomPropViewModel со свойством Name = «Test Prop 1» в его коллекцию CustomProperties и обновите значение свойства Value с «Hello» на «Hi».
Подробнее здесь: https://stackoverflow.com/questions/782 ... n-datagrid