Лучший отвечающий
Столбцы WPF DataGrid в ресурсах другой сборки. возможно?

Вопрос
-
Добрый день, существует небольшое затруднение...
Проект на 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 следующего вида<!--Колонка--> <my:DataGridTextColumn x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type local:CustomResource}, ResourceId=FC}" x:Shared="False" Header="First Name" Binding="{Binding FirstName}" />
Далее добавляю в другой проект References на мою сборку, кидаю на форму созданный DataGrid и пытаюсь добавить столбцы из ресурсов другой сборки так:<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 в ресурсах того же проекта и использовать следующий синтаксис:
<TDG:TreeDataGrid> <TDG:TreeDataGrid.Columns> <StaticResource ResourceKey="FC"/> </TDG:TreeDataGrid.Columns> </TDG:TreeDataGrid>
То всё работает, но получается нет разделение на сборки.В общем вопрос:
Можно ли как то обойти эксепшен и создать проект в отдельной сборке, либо придётся делать его в той же, где и предполагается использовать?
Либо я вообще выбрал не правильный способ построения контрола и/или расположения шаблона и нужно как то делать по другому...23 августа 2012 г. 7:10
Ответы
-
Не очень понял, зачем вам такой сложный key.
У меня в одной из сборок есть файл (Resources.xaml) с таким ресурсом:
<SolidColorBrush x:Key="BaseGridBackgroundBrush" Color="White" />
Вот так подключаю этот файл с ресурсами (BaseComponents.Client.WebLib - это имя сборки с файлом Resources.xaml, который лежит в папке Themes):
<Application.Resources> <ResourceDictionary Source="/BaseComponents.Client.WebLib;component/Themes/Resources.xaml" /> </Application.Resources>
Ну а использование уже вот такое:
<Grid Background="{StaticResource BaseGridBackgroundBrush}"
Попробуйте по аналогичной схеме...- Помечено в качестве ответа Alexeil Korobov 24 августа 2012 г. 6:46
23 августа 2012 г. 7:57Отвечающий
Все ответы
-
Не очень понял, зачем вам такой сложный key.
У меня в одной из сборок есть файл (Resources.xaml) с таким ресурсом:
<SolidColorBrush x:Key="BaseGridBackgroundBrush" Color="White" />
Вот так подключаю этот файл с ресурсами (BaseComponents.Client.WebLib - это имя сборки с файлом Resources.xaml, который лежит в папке Themes):
<Application.Resources> <ResourceDictionary Source="/BaseComponents.Client.WebLib;component/Themes/Resources.xaml" /> </Application.Resources>
Ну а использование уже вот такое:
<Grid Background="{StaticResource BaseGridBackgroundBrush}"
Попробуйте по аналогичной схеме...- Помечено в качестве ответа Alexeil Korobov 24 августа 2012 г. 6:46
23 августа 2012 г. 7:57Отвечающий -
Делал такой Key т.к. располагал столбец в словаре ресурсов Themes/Generic.xaml, соответственно при таком подходе нужно для Key использовать ComponentResourceKey, в результате не нужно прописывать следующий код:
<Application.Resources> <ResourceDictionary Source="..." /> </Application.Resources>
но применение осуществляется с помощью DynamicResource, а не StaticResource
-----
Попробывал использовать Ваш подход, всё получилось, спасибо)
- Изменено Alexeil Korobov 24 августа 2012 г. 6:49 орфография
24 августа 2012 г. 6:46 -
Спасибо за ваш комментарий к решению и за то, что не забыли отметить решение как ответ.
Для связи [mail]
24 августа 2012 г. 7:30