none
Разные сборки. Как получить доступ к экземпляру класса? RRS feed

  • Вопрос

  • Добрый день, подскажите пожалуйста общую идею действия...

    Проект на WPF framework 3.5 sp1 c использованием WPFToolKit.

    Общая идея проекта  здесь

    1. Имеем WPF проект Custom Control Library,  класс наследуем от  WPFToolKit DataGrid и называем TreeDataGrid

    2. Имеем ResourceDictionary, в котором определён шаблон столбца DataGridTemplateColum содержащий ToggeButton, в котором установлены события Checked и UnCheсked. ResourceDictionary связан с классом ClassForResources.cs, в котором и установлены данные события.

    3. В данных событиях необходимо скрывать и отображать строки TreeDataGrid, управляя свойством строк Visability.

    4. Подключаем нашу сборку в другой проект, в XAML помещаем наш TreeDataGrid и через систему ресурсов, устанавливаем ему описанный DataGridTemplateColum.

    Теперь имеем затруднения:

      Для управления скрытием и отображением строк через свойством Visability в событиях другой сборки, определённых в классе ClassForResources.cs, нам нужно получить экземпляр TreeDataGrid, который создан в другой сборке.

    Либо получить ItemsSource экземпляра нашего DataGrid, там создать лишнее свойство, либо столбец в DataTable, для управления через Binding видимостью, но не суть, в любом случае, как я понял, нужен доступ к экземпляру класса в сборке, где описан только класс, а для этого необходимо использовать static поля.

    Варианты того, что пытался сделать:

    1. в нашем TreeDataGrid определяю статическое поле типа TreeDataGrid, делаю параметризированный конструктор и инициализирую его в нём. Получается при инициализации компонента он имеет сслылку на свой экземпляр.

     Ошибка: Использовать можно framework 3.5 и там нет директивы x:Arguments, для инициализации параметризированных конструкторов в XAML. соответственно собрать и проверить не получилось...

    2. Далее убрал написанный код и стал делать через свойтва зависимостей (назвал свойство _RootElement), инициализация в коде прошла

         <TDG:TreeDataGrid _RootElement="{Binding ElementName=TDGIndicator}" x:Name="TDGIndicator" AutoGenerateColumns="False">
                <TDG:TreeDataGrid.Columns>
                    <StaticResource ResourceKey="TreeColumn"/>
                </TDG:TreeDataGrid.Columns>
         </TDG:TreeDataGrid>

    Но получить в коде ClassForResources.cs доступ таким образом не получается:

    TreeDataGrid _Grid = DependencyObject.GetValue(TreeDataGrid._RootElementProperty);

    Получаем ошибку

    Error    1    Для нестатического поля, метода или свойства "System.Windows.DependencyObject.GetValue(System.Windows.DependencyProperty)" требуется ссылка на объек

    3. Начал исследовать как сделать через VisualTreeHelper, но как понял, ему тоже нужна ссылка на экземпляр родителського элемента...

    Соответственно хотелось бы получить идею, как можно получить доступ к экземпляру класса в данной ситуации, либо как изменить подход к реализации... реализовывать события каждый раз при использовании TreeDataGrid не хотелось бы, т.к. они одинаковые, и различаются лишь названиями TreeDataGrid и его ItemSource т.к. в качестве источника данных хочу использовать классы, на базе абстрактного.

    Вообще, кажется, в принципе не верно пытаться получать доступ к экземпляру класса в данном случает, но я немного запутался...



    31 августа 2012 г. 10:09

Ответы

  • Вдруг кому пригодится, нашёл сам решение:

    В общем такой подход (получение экземпляра класса в классе) оказался действительно не верным, и вообще, кажется, не очень разумным,

    необходимо действовать по другому:

       В событиях ToggleButton Cheched и UnChecked класса ClassForResources.cs необходимо с помощью VisualTreeHelper найти элемент типа TreeDataGrid в котором непосредственно располагается наш DataGridTemplateColum следующим образом:

    DependencyObject parent = VisualTreeHelper.GetParent(sender as DependencyObject);            
    TreeDataGrid TDG = parent as TreeDataGrid;            
    while ((TDG == null) && (parent != null))
    {                
      parent = VisualTreeHelper.GetParent(parent);                
      TDG = parent as TreeDataGrid;            
    }            
    if (TDG == null)            
    {                
       throw new System.ArgumentException("Can't find parent for 'DataGridTemplateColum' of type 'TreeDataGrid'!", "Error");            
    }
    В итоге мы получим экземпляр класса TreeDataGrid, в котором располагается наш столбец.


    • Помечено в качестве ответа Alexeil Korobov 31 августа 2012 г. 12:27
    31 августа 2012 г. 12:27

Все ответы

  • Вдруг кому пригодится, нашёл сам решение:

    В общем такой подход (получение экземпляра класса в классе) оказался действительно не верным, и вообще, кажется, не очень разумным,

    необходимо действовать по другому:

       В событиях ToggleButton Cheched и UnChecked класса ClassForResources.cs необходимо с помощью VisualTreeHelper найти элемент типа TreeDataGrid в котором непосредственно располагается наш DataGridTemplateColum следующим образом:

    DependencyObject parent = VisualTreeHelper.GetParent(sender as DependencyObject);            
    TreeDataGrid TDG = parent as TreeDataGrid;            
    while ((TDG == null) && (parent != null))
    {                
      parent = VisualTreeHelper.GetParent(parent);                
      TDG = parent as TreeDataGrid;            
    }            
    if (TDG == null)            
    {                
       throw new System.ArgumentException("Can't find parent for 'DataGridTemplateColum' of type 'TreeDataGrid'!", "Error");            
    }
    В итоге мы получим экземпляр класса TreeDataGrid, в котором располагается наш столбец.


    • Помечено в качестве ответа Alexeil Korobov 31 августа 2012 г. 12:27
    31 августа 2012 г. 12:27
  • Спасибо, что поделились решением проблемы.

    Для связи [mail]

    3 сентября 2012 г. 9:59