|
MVVM - DataGrid - динамическое кол-во столбцов
|
|||
---|---|---|---|
#18+
собсна имеется некий класс, реализующий ICustomTypeDescriptor, кол-во свойств (полей, называейт как хотите) может быть разным. коллекция этих объектов является источником для грида, значения свойств (полей) хотелось бы видеть в столбцах (Columns) DataGrid. вопрос в чем - как бы это покрасивше уложить это дело в MVVM паттерн, как-то у меня не получилось :( но я в MVVM новичок, пока только эксперементирую. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2011, 13:26 |
|
MVVM - DataGrid - динамическое кол-во столбцов
|
|||
---|---|---|---|
#18+
winsky!собсна имеется некий класс, реализующий ICustomTypeDescriptor, кол-во свойств (полей, называейт как хотите) может быть разным. коллекция этих объектов является источником для грида, значения свойств (полей) хотелось бы видеть в столбцах (Columns) DataGrid. вопрос в чем - как бы это покрасивше уложить это дело в MVVM паттерн, как-то у меня не получилось :( но я в MVVM новичок, пока только эксперементирую. Спасибо.1. Сделать генерацию колонок грида прямо в классе морды (UserControl, Window и т. п.). Вынести этот код в стратегию и вызывать из Loaded event или откуда удобнее. 2. Сделать присоединяемое свойство. 3. Сделать attached behavior на базе библиотеки System.Windows.Interactivity (Expresion Blend SDK). 4. Унаследовать контрол от DataGrid, и реализовать там. Другими словами, каким-либо доступным способом поместить этот код в морду. Это чисто её задача. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2011, 18:28 |
|
MVVM - DataGrid - динамическое кол-во столбцов
|
|||
---|---|---|---|
#18+
winsky!, Если проблема в биндинге к объекту с произвольным количеством свойств, то http://forums.silverlight.net/forums/p/95440/218611.aspx#7.2_H ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2011, 07:04 |
|
MVVM - DataGrid - динамическое кол-во столбцов
|
|||
---|---|---|---|
#18+
enigmaticwinsky!, Если проблема в биндинге к объекту с произвольным количеством свойств, то http://forums.silverlight.net/forums/p/95440/218611.aspx#7.2_H Эта ссылка для SL2. C четвертой версии, где появился DynamicObject, нет никаких проблем ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2011, 07:33 |
|
MVVM - DataGrid - динамическое кол-во столбцов
|
|||
---|---|---|---|
#18+
i, Окей, разные варианты это хорошо. Плохо то, что http://connect.microsoft.com/VisualStudio/feedback/details/522119/databinding-to-dynamic-objects-is-broken Кстати, генерация типов в рантайме в числе "работ вокруг". ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2011, 10:55 |
|
MVVM - DataGrid - динамическое кол-во столбцов
|
|||
---|---|---|---|
#18+
Алексей К, Алексей К1. Сделать генерацию колонок грида прямо в классе морды (UserControl, Window и т. п.). Вынести этот код в стратегию и вызывать из Loaded event или откуда удобнее так и делал, но не прет, хочется чтобы "оно само" :) хочется что-то вроде такого (псевдокод): Код: plaintext 1. 2. 3. 4.
над остальными предложенными вами способами подумаю, в любом случае, спасибо за ответ :) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2011, 11:00 |
|
MVVM - DataGrid - динамическое кол-во столбцов
|
|||
---|---|---|---|
#18+
enigmatic, enigmaticКстати, генерация типов в рантайме в числе "работ вокруг". не понял мысль. кстати я не говорил о генерации именно типов в рантайме, у меня генерируются только св-ва с весьма опрделенными типами. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2011, 11:08 |
|
MVVM - DataGrid - динамическое кол-во столбцов
|
|||
---|---|---|---|
#18+
winsky!, А что на счет AutoGenerateColumns = true? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2011, 12:49 |
|
MVVM - DataGrid - динамическое кол-во столбцов
|
|||
---|---|---|---|
#18+
winsky!, То есть генерация класса бизнес-объекта, который есть набор свойств, а к каждому свойству мы привязываем столбец грида. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2011, 13:07 |
|
MVVM - DataGrid - динамическое кол-во столбцов
|
|||
---|---|---|---|
#18+
enigmatici, Окей, разные варианты это хорошо. Плохо то, что http://connect.microsoft.com/VisualStudio/feedback/details/522119/databinding-to-dynamic-objects-is-broken Кстати, генерация типов в рантайме в числе "работ вокруг". C DynamicObject точнее было бы сказать, что не работает как в WPF. C этим можно было бороться с помощью конвертеров или индексных свойств. Но с ICustomTypeDescriptor в пятой версии теперь дела обстоят даже лучше, чем в WPF, тк после добавления свойств известны их типы при binding'е. Сейчас гоняю тесты, пока все ок(в частности, после добавления свойств к объекту, автогенерация в datagrid'е проходит отлично). Красота! Гибкость членов необыкновенная!!!! ЗЫ По теме. Можно еще задавать свои аттрибуты свойствам и поним генерить нужные столбцы ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2011, 13:24 |
|
MVVM - DataGrid - динамическое кол-во столбцов
|
|||
---|---|---|---|
#18+
Руки-крюкиwinsky!, А что на счет AutoGenerateColumns = true? есть возможность сгенерировать колонки не для всех свойств? по-моему - нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2011, 14:03 |
|
MVVM - DataGrid - динамическое кол-во столбцов
|
|||
---|---|---|---|
#18+
enigmaticwinsky!, То есть генерация класса бизнес-объекта, который есть набор свойств, а к каждому свойству мы привязываем столбец грида. так у меня проблема не в создании/генерации класса бизнес-объекта, а в его отображении в виде строки в гриде, вернее даже сказать - как это уложить в паттерн MVVM - вопрос носит где-то даже теоретический характер, но если решение будет - можно применить и на практике :) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2011, 14:06 |
|
MVVM - DataGrid - динамическое кол-во столбцов
|
|||
---|---|---|---|
#18+
SeVaЗЫ По теме. Можно еще задавать свои аттрибуты свойствам и поним генерить нужные столбцы я вас очень прошу высказываться в этом топике исключительно по теме (воспринимать именно как просьбу). генерить столбцы - самое простое и очевидное решение, собственно в одном из проектов его и использовал, но мне оно не нравится, даже не могу сформулировать чем, как только смогу - скажу :) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2011, 14:09 |
|
MVVM - DataGrid - динамическое кол-во столбцов
|
|||
---|---|---|---|
#18+
winsky!Алексей К1. Сделать генерацию колонок грида прямо в классе морды (UserControl, Window и т. п.). Вынести этот код в стратегию и вызывать из Loaded event или откуда удобнее так и делал, но не прет, хочется чтобы "оно само" :) А в любом случае где-то придётся подписываться на событие. В случае с attached property/behavior или MyDataGrid подписка на событие выносится из прикладного кода, что наверное хорошо. В случае с attached property ещё появляется возможность присваивать его через стиль, что может быть весьма полезно. winsky!хочется что-то вроде такого (псевдокод): Код: plaintext 1. 2. 3. 4.
над остальными предложенными вами способами подумаю, в любом случае, спасибо за ответ :) В случае с attached property это может выглядеть как-то так: Код: plaintext
Через interaction может быть как-то так. Но принцип тот же. Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2011, 15:09 |
|
MVVM - DataGrid - динамическое кол-во столбцов
|
|||
---|---|---|---|
#18+
ЗЫ: Я бы "по старинке" унаследовал контрол от датагрида и сделал там. Предполагаю, что вероятность использования этой фичи с разными типами DataGrid-ов не высока. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2011, 15:12 |
|
MVVM - DataGrid - динамическое кол-во столбцов
|
|||
---|---|---|---|
#18+
Алексей КЗЫ: Я бы "по старинке" унаследовал контрол от датагрида и сделал там. Предполагаю, что вероятность использования этой фичи с разными типами DataGrid-ов не высока. не в моем случае :) хотя, используя этот подход можно тоже добиться достаточной гибкости. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2011, 15:22 |
|
MVVM - DataGrid - динамическое кол-во столбцов
|
|||
---|---|---|---|
#18+
winsky!Руки-крюкиwinsky!, А что на счет AutoGenerateColumns = true? есть возможность сгенерировать колонки не для всех свойств? по-моему - нет. Я уверен есть атрибут, который заставляет грид игнорировать свойство. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2011, 15:50 |
|
MVVM - DataGrid - динамическое кол-во столбцов
|
|||
---|---|---|---|
#18+
winsky!SeVaЗЫ По теме. Можно еще задавать свои аттрибуты свойствам и поним генерить нужные столбцы я вас очень прошу высказываться в этом топике исключительно по теме (воспринимать именно как просьбу). генерить столбцы - самое простое и очевидное решение, собственно в одном из проектов его и использовал, но мне оно не нравится, даже не могу сформулировать чем, как только смогу - скажу :) Если тебе не нравится генерация столбцов и есть ICustomTypeProvider, то не морочь нам голову, пусть он возвращает тип с набором только тех свойств, которые нужно отображать в гриде ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2011, 16:15 |
|
MVVM - DataGrid - динамическое кол-во столбцов
|
|||
---|---|---|---|
#18+
SeVa, Если Вы так бережете свою голову - просто не читайте этот топик. Заранее спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2011, 17:03 |
|
MVVM - DataGrid - динамическое кол-во столбцов
|
|||
---|---|---|---|
#18+
Руки-крюкиwinsky!пропущено... есть возможность сгенерировать колонки не для всех свойств? по-моему - нет. Я уверен есть атрибут, который заставляет грид игнорировать свойство. атрибута не нашел, но есть события AutoGeneratingColumn & AutoGeneratedColumns можно конечно как-то вот так: Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2011, 19:08 |
|
MVVM - DataGrid - динамическое кол-во столбцов
|
|||
---|---|---|---|
#18+
winsky!атрибута не нашелМожет [Browsable(False)] ? Или что-то из System.ComponentModel.DataAnnotations namespace ? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2011, 19:24 |
|
MVVM - DataGrid - динамическое кол-во столбцов
|
|||
---|---|---|---|
#18+
Posted by Microsoft on 23.04.2009 at 13:34Hi Moondaddy! In Visual Studio 2010 the browsable attribute will work for WPF. Интересно, автор сдержал своё обещание? :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2011, 19:41 |
|
MVVM - DataGrid - динамическое кол-во столбцов
|
|||
---|---|---|---|
#18+
Руки-крюкиЯ уверен есть атрибут, который заставляет грид игнорировать свойство. Очередной бред. Тут всё есть http://wpf.codeplex.com/ ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2011, 18:50 |
|
MVVM - DataGrid - динамическое кол-во столбцов
|
|||
---|---|---|---|
#18+
iРуки-крюкиЯ уверен есть атрибут, который заставляет грид игнорировать свойство. Очередной бред. Тут всё есть http://wpf.codeplex.com/ будьте добры ткнуть меня носом, где там это все? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2011, 11:48 |
|
MVVM - DataGrid - динамическое кол-во столбцов
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2012, 12:47 |
|
MVVM - DataGrid - динамическое кол-во столбцов
|
|||
---|---|---|---|
#18+
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; } } } Модератор: Уберите ссылки из автоподписи! ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2012, 13:05 |
|
|
start [/forum/topic.php?all=1&fid=21&tid=1441951]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
36ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 305ms |
total: | 438ms |
0 / 0 |