none
Столбцы WPF DataGrid в ресурсах другой сборки. возможно? RRS feed

  • Вопрос

  • Добрый день, существует небольшое затруднение...

    Проект на 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