powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Иерархический DataGrid, как правильно оформить контрол?
5 сообщений из 5, страница 1 из 1
Иерархический DataGrid, как правильно оформить контрол?
    #37926427
Nuki_Nuki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проект на WPF framework 3.5 sp1 c использованием WPFToolKit.
Задача:
Необходимо в DataGrid отображать иерархические данные.
Найденное решение:
1. Пишется шаблон для DataGridTemplateColumn, который имитирует дерево и стоит всегда слева, т.е. в нём ToggleButton с переопределённым стилем, который теперь похож на "+" когда свёрнуто и "-" когда развёрнуто и TextBlock для текста.
2. Пишутся конверторы которые управляют свойством Margin для имитации вложенности элементов в ветви, видимостью ToggleButton, если нет детей и т.д.
3. Для ToggleButton пишутся методы для отображение и скрытия строк в DataGrid с использованием свойства строк Visability.
Всё это чуть дышет, нужна отладка, но не суть, вопрос в другом, это общее состояние дел...
Проблемма:
Данный контрол будет использоваться в нескольких местах, необходимо избежать дублирования кода шаблона и методов
То, как решаю проблему:
1. Хочу оформить контрол в отдельной сборке
2. Создаю новый проект WPF Custom Control Library соответственно имею класс, который наследую от DataGrid (в него помещу необходимые методы) и файл Generic.xaml, в котором определён ResourceDictionary (в него помещу шаблон DataGridTemplateColumn).

Пока экспериментирую просто с DataGridTextColumn, при таком подходе ресурсы нужно будет делить между несколькими сборками,
потому x:Key следующего вида
Код: c#
1.
2.
3.
4.
5.
 <!--Колонка-->
    <my:DataGridTextColumn 
      x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type local:CustomResource}, ResourceId=FC}" 
      x:Shared="False" Header="First Name" Binding="{Binding FirstName}"
    />



Далее добавляю в другой проект References на мою сборку, кидаю на форму новый DataGrid и пытаюсь добавить столбцы из ресурсов другой сборки так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
  
   <TDG:TreeDataGrid>
          <TDG:TreeDataGrid.Columns>
               <DynamicResource  ResourceKey="{ComponentResourceKey TypeInTargetAssembly={x:Type TDG:CustomResource}, ResourceId=FC}" />
           </TDG:TreeDataGrid.Columns>
    </TDG:TreeDataGrid>
   



В результате имею ошибку:
авторProperty 'Columns' does not support values of type 'DynamicResourceExtension'.

Если объявлять DataGridTextColumn в ресурсах того же проекта и использовать следующий синтаксис:
Код: c#
1.
2.
3.
4.
5.
<TDG:TreeDataGrid>
          <TDG:TreeDataGrid.Columns>
                 <StaticResource ResourceKey="FC"/>
           </TDG:TreeDataGrid.Columns>
 </TDG:TreeDataGrid>



То вполне логично что всё работает, но получается нет разделение на сборки.

В общем вопрос:
Можно ли как то обойти эксепшен и создать проект в отдельной сборке, либо придётся делать его в той же, где и предполагается использовать?
Либо я вообще выбрал не правильный способ построения контрола и/или расположения шаблона и нужно как то делать по другому, либо вообще нужно по другому строить сам контрол...
...
Рейтинг: 0 / 0
Иерархический DataGrid, как правильно оформить контрол?
    #37926490
hex.style
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nuki_Nuki, сборки можешь разделять, как хочешь. Только делай на них ссылки в заголовке:

Код: c#
1.
xmlns:myCrap="clr-namespace:myCrapNamespace;assembly=myCrapAssembly"
...
Рейтинг: 0 / 0
Иерархический DataGrid, как правильно оформить контрол?
    #37926596
Nuki_Nuki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hex.style,

Это сделал уже, извиняюсь, не до конца в пример вставил, там просто в части
Код: c#
1.
TypeInTargetAssembly={x:Type TDG:CustomResource}, ResourceId=FC}"


она TDG называется...

Если этим способом делать что нить другое, например BackGround - то всё работает, проблемма именно в том,
что столбцы DataGrid не поддерживают динамические ресурсы, ну как я понял из эксепшена, вот думаю можно ли как то это обойти и оставить их в ресурсе другой сборки...
...
Рейтинг: 0 / 0
Иерархический DataGrid, как правильно оформить контрол?
    #37926700
hex.style
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nuki_Nukihex.style,

Это сделал уже, извиняюсь, не до конца в пример вставил, там просто в части
Код: c#
1.
TypeInTargetAssembly={x:Type TDG:CustomResource}, ResourceId=FC}"


она TDG называется...

Если этим способом делать что нить другое, например BackGround - то всё работает, проблемма именно в том,
что столбцы DataGrid не поддерживают динамические ресурсы, ну как я понял из эксепшена, вот думаю можно ли как то это обойти и оставить их в ресурсе другой сборки...

Какие-то танцы с бубном... пример в студию! =)
...
Рейтинг: 0 / 0
Иерархический DataGrid, как правильно оформить контрол?
    #37929032
Nuki_Nuki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем может быть кому-нить пригодится:

Для обхода эксепшена и расположения столбцов DataGrid в разных сборках - применять динамические ресурсы нельзя, следовательно идём другим путём:

1. Создаём в папке Themes словарь ресурсов Resources.xaml, и помещаем столбец в него, а не в Generic.xaml

Код: c#
1.
2.
<!--Колонка-->
    <ToolKit:DataGridTextColumn x:Key="FirstColumn" Header="Первый столбец"/>



2. Подключаем референс на созданную сборку с новым datagrid и в файле App.xaml прописываем ссылку на ресурсы другой стобрки:

Код: c#
1.
2.
3.
4.
         
 <Application.Resources> 
      <ResourceDictionary Source="/TDataGrid;component/Themes/Resources.xaml" />
 </Application.Resources>



В результате имеем статический ресурс другой сборки, ну и соответственно далее работаем как обычно:

Код: c#
1.
2.
3.
4.
5.
<TDG:TDataGrid>
            <TDG:TDataGrid.Columns>
                <StaticResource ResourceKey="FirstColumn"/>
            </TDG:TDataGrid.Columns>
</TDG:TDataGrid>
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Иерархический DataGrid, как правильно оформить контрол?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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