Как создать привязку для динамически создаваемых столбцов в DataGrid?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как создать привязку для динамически создаваемых столбцов в DataGrid?

Сообщение Anonymous »

Я занимаюсь разработкой приложений WPF. И в одном из наших диалогов есть DataGrid. Этот DataGrid должен отображать информацию о некоторых трехмерных точках. Для этого у нас есть класс PointViewModel с 4 обязательными основными свойствами — Name, X, Y, Z:

Код: Выделить всё

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;

}
Кроме того, каждая точка может иметь некоторые пользовательские свойства. На момент запуска приложения мы не знаем никакой информации об этих свойствах, поэтому их следует создавать динамически. Для этих пользовательских свойств каждая точка имеет коллекцию CustomProperties. Каждая PointCustomPropViewModel содержит информацию об имени и значении свойства, вот и все:

Код: Выделить всё

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;
}
Итак, здесь я создаю 3 тестовые точки, каждая точка также имеет 2 настраиваемых свойства. Пользовательские свойства можно добавлять или удалять в любое время, когда пользователь что-то делает в диалоговом окне. И в любой момент вначале мы не знаем фактического количества, имен и значений для этих пользовательских свойств.
Но наш 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»