powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / DataGrid Binding - неопределённое число полей.
8 сообщений из 8, страница 1 из 1
DataGrid Binding - неопределённое число полей.
    #39257837
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет, давненько не заглядывал.

Подскажите такую вещь. Есть 2-мерная таблица, у которой не известно заранее число колонок. Как корректно забиндить это всё в DataGrid?

Т.е. базовые вещи я понял, как делаются. Примерчики почитал, но там везде делается ObservableCollection<КакойНибудьКласс>, у которого число свойств фиксированное. В моём же случае даже не получается сделать класс, к полям которого можно было бы прибиндиться (ну, понятно, можно сконструировать его через Reflection, но это громоздко). Хотя можно сделать класс с фиксированным набором полей, а остальные получать через GetAdditionalValue(int index).
Так же нашёл примерчик с GetBindable2DArray, но тогда сортировка не работает.

Как можно это сделать?
...
Рейтинг: 0 / 0
DataGrid Binding - неопределённое число полей.
    #39257848
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например, забиндить к DataTable. Или реализовать самому что-то подобное: 18781617 .
...
Рейтинг: 0 / 0
DataGrid Binding - неопределённое число полей.
    #39257872
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны, спасибо, интересно, сейчас посмотрю!
...
Рейтинг: 0 / 0
DataGrid Binding - неопределённое число полей.
    #39257953
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны, у меня почему-то не вызывается GetValue для полей из массива. Не понятно, колонки в гриде создаются, но отображаются пустыми. Биндинг ругается:

System.Windows.Data Error: 40 : BindingExpression path error: 'V2' property not found on 'object' ''Rez' (HashCode=1155772)'. BindingExpression:Path=V2; DataItem='Rez' (HashCode=1155772); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')

ну а вот мои классики:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
	public class Rez
	{
		public static readonly int NumberOfReservedFields = 3;
		public int Id { get; set; }
		public string Name { get; set; }
		public double BaseValue { get; set; }
		public double[] Values { get; set; }
	}

	public class RezM : List<Rez>, ITypedList
	{
		public string GetListName(PropertyDescriptor[] listAccessor)
		{
			return GetType().FullName;
		}

		public static readonly string[] Names = { "Id", "Name", "BaseValue", "V2", "V3" };

		public PropertyDescriptorCollection GetItemProperties(PropertyDescriptor[] listAccessors)
		{
			return new PropertyDescriptorCollection(Names.Select(s => new RezPropertyDescriptor(s, null)).ToArray());
		}
	}

	public class RezPropertyDescriptor : PropertyDescriptor
	{
		public RezPropertyDescriptor(string name, Attribute[] attrs)
			: base(name, attrs)
		{
		}

		public RezPropertyDescriptor(MemberDescriptor desc)
			: base(desc)
		{
		}

		public RezPropertyDescriptor(MemberDescriptor desc, Attribute[] attrs)
			: base(desc, attrs)
		{
		}
		
		public override bool CanResetValue(object component)
		{
			return false;
		}

		public override object GetValue(object component)
		{
			var pi = typeof(Rez).GetProperty(Name, System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);

			return pi != null ? pi.GetValue(component, null) : ((Rez)component).Values[Array.IndexOf(RezM.Names, Name) - Rez.NumberOfReservedFields];
		}

		public override void ResetValue(object component)
		{
		}

		public override void SetValue(object component, object value)
		{
		}

		public override bool ShouldSerializeValue(object component)
		{
			return false;
		}

		public override Type ComponentType
		{
			get { return typeof(Rez); }
		}

		public override bool IsReadOnly
		{
			get { return true; }
		}

		public override Type PropertyType
		{
			get
			{
				var pi = typeof(Rez).GetProperty(Name, System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
				return pi == null ? typeof(double) : pi.DeclaringType;
			}
		}
	}
...
Рейтинг: 0 / 0
DataGrid Binding - неопределённое число полей.
    #39257973
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
брейкпоинт ставил, в GetValue даже не заходит.
...
Рейтинг: 0 / 0
DataGrid Binding - неопределённое число полей.
    #39258032
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть несколько вариантов:
вариант а:
Создаем AttachedProperty с типом IList<IColumn>, в Changed методе просто генерируем нужные DataGridColumns нужных нам типов
вариант б:
Создаем наследованный от DataGrid класс, добавляем DependencyProperty и делаем то же самое.
вариант в:
Создаем свой контрол, который будет содержать в своём шаблоне DataGrid, все нужные свойства создаем с помощью AddOwner и пробрасываем через TemplateBinding. Потом смотрим вариант б.
...
Рейтинг: 0 / 0
DataGrid Binding - неопределённое число полей.
    #39258033
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S. вообще забыл сказать, что Binding поддерживает индексы.
то есть, поддерживает вот такую запись {Binding Values[0]}
То есть, можно создать список строк которые будут содержать в себе словарь значений, каждая сгенерированная колонка будет связывать ячейку с элементом словаря строки, по её индексу.
...
Рейтинг: 0 / 0
DataGrid Binding - неопределённое число полей.
    #39258096
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тема, конечно, интересная. Но я подумал, и сделал всё на DataTable. Эти заморочки с полями, индексами - очень непонятно потом будет для новичков. А тут всё получилось очень прозрачно и легко поддаётся чтению.

Спасибо всем за помощь.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / DataGrid Binding - неопределённое число полей.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]