powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / MVVM - DataGrid - динамическое кол-во столбцов
26 сообщений из 26, показаны все 2 страниц
MVVM - DataGrid - динамическое кол-во столбцов
    #37285304
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
собсна имеется некий класс, реализующий ICustomTypeDescriptor,
кол-во свойств (полей, называейт как хотите) может быть разным.
коллекция этих объектов является источником для грида, значения свойств (полей) хотелось бы видеть в столбцах (Columns) DataGrid.
вопрос в чем - как бы это покрасивше уложить это дело в MVVM паттерн, как-то у меня не получилось :(
но я в MVVM новичок, пока только эксперементирую.
Спасибо.
...
Рейтинг: 0 / 0
MVVM - DataGrid - динамическое кол-во столбцов
    #37286070
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
winsky!собсна имеется некий класс, реализующий ICustomTypeDescriptor,
кол-во свойств (полей, называейт как хотите) может быть разным.
коллекция этих объектов является источником для грида, значения свойств (полей) хотелось бы видеть в столбцах (Columns) DataGrid.
вопрос в чем - как бы это покрасивше уложить это дело в MVVM паттерн, как-то у меня не получилось :(
но я в MVVM новичок, пока только эксперементирую.
Спасибо.1. Сделать генерацию колонок грида прямо в классе морды (UserControl, Window и т. п.). Вынести этот код в стратегию и вызывать из Loaded event или откуда удобнее.
2. Сделать присоединяемое свойство.
3. Сделать attached behavior на базе библиотеки System.Windows.Interactivity (Expresion Blend SDK).
4. Унаследовать контрол от DataGrid, и реализовать там.

Другими словами, каким-либо доступным способом поместить этот код в морду. Это чисто её задача.
...
Рейтинг: 0 / 0
MVVM - DataGrid - динамическое кол-во столбцов
    #37286538
enigmatic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
winsky!,

Если проблема в биндинге к объекту с произвольным количеством свойств, то http://forums.silverlight.net/forums/p/95440/218611.aspx#7.2_H
...
Рейтинг: 0 / 0
MVVM - DataGrid - динамическое кол-во столбцов
    #37286544
i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
i
Гость
enigmaticwinsky!,

Если проблема в биндинге к объекту с произвольным количеством свойств, то http://forums.silverlight.net/forums/p/95440/218611.aspx#7.2_H

Эта ссылка для SL2. C четвертой версии, где появился DynamicObject, нет никаких проблем
...
Рейтинг: 0 / 0
MVVM - DataGrid - динамическое кол-во столбцов
    #37286742
enigmatic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
i,

Окей, разные варианты это хорошо.
Плохо то, что http://connect.microsoft.com/VisualStudio/feedback/details/522119/databinding-to-dynamic-objects-is-broken
Кстати, генерация типов в рантайме в числе "работ вокруг".
...
Рейтинг: 0 / 0
MVVM - DataGrid - динамическое кол-во столбцов
    #37286751
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,

Алексей К1. Сделать генерацию колонок грида прямо в классе морды (UserControl, Window и т. п.). Вынести этот код в стратегию и вызывать из Loaded event или откуда удобнее
так и делал, но не прет, хочется чтобы "оно само" :)

хочется что-то вроде такого (псевдокод):
Код: plaintext
1.
2.
3.
4.
<DataGrid >
            <DataGrid.Columns>
                <Binding></Binding>
            </DataGrid.Columns>
 </DataGrid> 
и в зависисомости от типа свойства привязанного к колонке - свой тип колонки, а-ля DataTemplate только для DataGridColumn.
над остальными предложенными вами способами подумаю,
в любом случае, спасибо за ответ :)
...
Рейтинг: 0 / 0
MVVM - DataGrid - динамическое кол-во столбцов
    #37286767
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
enigmatic,

enigmaticКстати, генерация типов в рантайме в числе "работ вокруг".
не понял мысль.
кстати я не говорил о генерации именно типов в рантайме, у меня генерируются только св-ва с весьма опрделенными типами.
...
Рейтинг: 0 / 0
MVVM - DataGrid - динамическое кол-во столбцов
    #37287034
Руки-крюки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
winsky!,

А что на счет AutoGenerateColumns = true?
...
Рейтинг: 0 / 0
MVVM - DataGrid - динамическое кол-во столбцов
    #37287081
enigmatic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
winsky!,

То есть генерация класса бизнес-объекта, который есть набор свойств, а к каждому свойству мы привязываем столбец грида.
...
Рейтинг: 0 / 0
MVVM - DataGrid - динамическое кол-во столбцов
    #37287131
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
enigmatici,

Окей, разные варианты это хорошо.
Плохо то, что http://connect.microsoft.com/VisualStudio/feedback/details/522119/databinding-to-dynamic-objects-is-broken
Кстати, генерация типов в рантайме в числе "работ вокруг".

C DynamicObject точнее было бы сказать, что не работает как в WPF. C этим можно было бороться с помощью конвертеров или
индексных свойств. Но с ICustomTypeDescriptor в пятой версии теперь дела обстоят даже лучше, чем в WPF, тк после добавления
свойств известны их типы при binding'е. Сейчас гоняю тесты, пока все ок(в частности, после добавления свойств к объекту, автогенерация в datagrid'е проходит отлично).

Красота! Гибкость членов необыкновенная!!!!

ЗЫ По теме. Можно еще задавать свои аттрибуты свойствам и поним генерить нужные столбцы
...
Рейтинг: 0 / 0
MVVM - DataGrid - динамическое кол-во столбцов
    #37287238
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Руки-крюкиwinsky!,

А что на счет AutoGenerateColumns = true?
есть возможность сгенерировать колонки не для всех свойств? по-моему - нет.
...
Рейтинг: 0 / 0
MVVM - DataGrid - динамическое кол-во столбцов
    #37287242
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
enigmaticwinsky!,

То есть генерация класса бизнес-объекта, который есть набор свойств, а к каждому свойству мы привязываем столбец грида.
так у меня проблема не в создании/генерации класса бизнес-объекта, а в его отображении в виде строки в гриде, вернее даже сказать - как это уложить в паттерн MVVM - вопрос носит где-то даже теоретический характер, но если решение будет - можно применить и на практике :)
...
Рейтинг: 0 / 0
MVVM - DataGrid - динамическое кол-во столбцов
    #37287250
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaЗЫ По теме. Можно еще задавать свои аттрибуты свойствам и поним генерить нужные столбцы
я вас очень прошу высказываться в этом топике исключительно по теме (воспринимать именно как просьбу).
генерить столбцы - самое простое и очевидное решение, собственно в одном из проектов его и использовал, но мне оно не нравится, даже не могу сформулировать чем, как только смогу - скажу :)
...
Рейтинг: 0 / 0
MVVM - DataGrid - динамическое кол-во столбцов
    #37287429
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
winsky!Алексей К1. Сделать генерацию колонок грида прямо в классе морды (UserControl, Window и т. п.). Вынести этот код в стратегию и вызывать из Loaded event или откуда удобнее
так и делал, но не прет, хочется чтобы "оно само" :)
А в любом случае где-то придётся подписываться на событие. В случае с attached property/behavior или MyDataGrid подписка на событие выносится из прикладного кода, что наверное хорошо. В случае с attached property ещё появляется возможность присваивать его через стиль, что может быть весьма полезно.
winsky!хочется что-то вроде такого (псевдокод):
Код: plaintext
1.
2.
3.
4.
<DataGrid >
            <DataGrid.Columns>
                <Binding></Binding>
            </DataGrid.Columns>
 </DataGrid> 
и в зависисомости от типа свойства привязанного к колонке - свой тип колонки, а-ля DataTemplate только для DataGridColumn.
над остальными предложенными вами способами подумаю,
в любом случае, спасибо за ответ :)
В случае с attached property это может выглядеть как-то так:
Код: plaintext
<DataGrid my:DataGridBehaviors.IsColumnsGeneratedFromListMetadata="True"/>
А уже там можно подписаться на ItemsSourceChanged/Loaded, и используя ITypedList извлечь метаданные, и сгенерировать колонки.

Через interaction может быть как-то так. Но принцип тот же.
Код: plaintext
1.
2.
3.
4.
<DataGrid>
    <i:Interaction.Behaviors>
        <my:DataGridColumnsGeneratorFromMetadataBehavior/>
    </i:Interaction.Behaviors>
</DataGrid>
...
Рейтинг: 0 / 0
MVVM - DataGrid - динамическое кол-во столбцов
    #37287440
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗЫ: Я бы "по старинке" унаследовал контрол от датагрида и сделал там. Предполагаю, что вероятность использования этой фичи с разными типами DataGrid-ов не высока.
...
Рейтинг: 0 / 0
MVVM - DataGrid - динамическое кол-во столбцов
    #37287469
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КЗЫ: Я бы "по старинке" унаследовал контрол от датагрида и сделал там. Предполагаю, что вероятность использования этой фичи с разными типами DataGrid-ов не высока.
не в моем случае :) хотя, используя этот подход можно тоже добиться достаточной гибкости.
...
Рейтинг: 0 / 0
MVVM - DataGrid - динамическое кол-во столбцов
    #37287574
Руки-крюки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
winsky!Руки-крюкиwinsky!,

А что на счет AutoGenerateColumns = true?
есть возможность сгенерировать колонки не для всех свойств? по-моему - нет.

Я уверен есть атрибут, который заставляет грид игнорировать свойство.
...
Рейтинг: 0 / 0
MVVM - DataGrid - динамическое кол-во столбцов
    #37287647
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
winsky!SeVaЗЫ По теме. Можно еще задавать свои аттрибуты свойствам и поним генерить нужные столбцы
я вас очень прошу высказываться в этом топике исключительно по теме (воспринимать именно как просьбу).
генерить столбцы - самое простое и очевидное решение, собственно в одном из проектов его и использовал, но мне оно не нравится, даже не могу сформулировать чем, как только смогу - скажу :)

Если тебе не нравится генерация столбцов и есть ICustomTypeProvider, то не морочь нам голову, пусть он возвращает тип с набором только тех свойств, которые нужно отображать в гриде
...
Рейтинг: 0 / 0
MVVM - DataGrid - динамическое кол-во столбцов
    #37287830
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVa,

Если Вы так бережете свою голову - просто не читайте этот топик.
Заранее спасибо.
...
Рейтинг: 0 / 0
MVVM - DataGrid - динамическое кол-во столбцов
    #37288063
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Руки-крюкиwinsky!пропущено...

есть возможность сгенерировать колонки не для всех свойств? по-моему - нет.

Я уверен есть атрибут, который заставляет грид игнорировать свойство.
атрибута не нашел, но есть события AutoGeneratingColumn & AutoGeneratedColumns
можно конечно как-то вот так:
Код: plaintext
1.
2.
3.
4.
 void myGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            if(someCondition)
                 e.Cancel = true;
        }
...
Рейтинг: 0 / 0
MVVM - DataGrid - динамическое кол-во столбцов
    #37288087
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
winsky!атрибута не нашелМожет [Browsable(False)] ?

Или что-то из System.ComponentModel.DataAnnotations namespace ?
...
Рейтинг: 0 / 0
MVVM - DataGrid - динамическое кол-во столбцов
    #37288110
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Posted by Microsoft on 23.04.2009 at 13:34Hi Moondaddy! In Visual Studio 2010 the browsable attribute will work for WPF.
Интересно, автор сдержал своё обещание? :-)
...
Рейтинг: 0 / 0
MVVM - DataGrid - динамическое кол-во столбцов
    #37295645
i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
i
Гость
Руки-крюкиЯ уверен есть атрибут, который заставляет грид игнорировать свойство.
Очередной бред. Тут всё есть http://wpf.codeplex.com/
...
Рейтинг: 0 / 0
MVVM - DataGrid - динамическое кол-во столбцов
    #37296519
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iРуки-крюкиЯ уверен есть атрибут, который заставляет грид игнорировать свойство.
Очередной бред. Тут всё есть http://wpf.codeplex.com/
будьте добры ткнуть меня носом, где там это все?
...
Рейтинг: 0 / 0
MVVM - DataGrid - динамическое кол-во столбцов
    #37648468
Sergio Kornelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
public class TestItem
{
[DisplayName("Display Name 1")]
public int Value1 { get; set; }

[DisplayName("Display Name 2")]
public int Value2 { get; set; }

[DisplayName("Display Name 3")]
public int Value3 { get; set; }
}

http://code.cheesydesign.com/?p=701
...
Рейтинг: 0 / 0
MVVM - DataGrid - динамическое кол-во столбцов
    #37648510
Sergio Kornelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MainWindow.xaml:

<Window x:Class="DataGridDisplayNameTest.MainWindow"
xmlns=" http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x=" http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
xmlns:dg="clr-namespace:System.Windows.Controls;assembly=PresentationFramework">
<Grid>
<dg:DataGrid x:Name="theGrid" AutoGenerateColumns="True" AutoGeneratingColumn="dg_AutoGeneratingColumn">
</dg:DataGrid>
</Grid>
</Window>
MainWindow.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.ComponentModel;
using System.Collections.ObjectModel;
using System.Reflection;

namespace DataGridDisplayNameTest {

/// <summary>
/// This test app demonstrates how to set the Column Headers in the WPF DataGrid
/// to the display name attribute of the bound property.
/// </summary>
public partial class MainWindow : Window {
public MainWindow() {
this.Initialized += new EventHandler(MainWindow_Initialized);
InitializeComponent();
}

/// <summary>
/// Add data to controls after they have been initialized
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void MainWindow_Initialized(object sender, EventArgs e) {
this.theGrid.ItemsSource = new ObservableCollection<TestItem>{
new TestItem {
Value1 = 11, Value2 = 12, Value3 = 13
},
new TestItem {
Value1 = 21, Value2 = 22, Value3 = 23
},
new TestItem {
Value1 = 31, Value2 = 32, Value3 = 33
}
};
}

/// <summary>
/// Event handler for when columns are added to the data grid
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void dg_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) {

string displayName = GetPropertyDisplayName(e.PropertyDescriptor);
if (!string.IsNullOrEmpty(displayName)) {
e.Column.Header = displayName;
}

}

/// <summary>
/// Gets the Display Name for the property descriptor passed in
/// </summary>
/// <param name="descriptor"></param>
/// <returns></returns>
public static string GetPropertyDisplayName(object descriptor) {

PropertyDescriptor pd = descriptor as PropertyDescriptor;
if (pd != null) {
// Check for DisplayName attribute and set the column header accordingly
DisplayNameAttribute displayName = pd.Attributes[typeof(DisplayNameAttribute)] as DisplayNameAttribute;
if (displayName != null && displayName != DisplayNameAttribute.Default) {
return displayName.DisplayName;
}

} else {
PropertyInfo pi = descriptor as PropertyInfo;
if (pi != null) {
// Check for DisplayName attribute and set the column header accordingly
Object[] attributes = pi.GetCustomAttributes(typeof(DisplayNameAttribute), true);
for (int i = 0; i < attributes.Length; ++i) {
DisplayNameAttribute displayName = attributes[i] as DisplayNameAttribute;
if (displayName != null && displayName != DisplayNameAttribute.Default) {
return displayName.DisplayName;
}
}
}
}
return null;
}

}

public class TestItem {
[DisplayName("Display Name 1")]
public int Value1 { get; set; }
[DisplayName("Display Name 2")]
public int Value2 { get; set; }
[DisplayName("Display Name 3")]
public int Value3 { get; set; }

}
}

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


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