Отображение объектов чертежа .draw в GUI на WPF с помощью listView

Автор Тема: Отображение объектов чертежа .draw в GUI на WPF с помощью listView  (Прочитано 4284 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн ДаниилАвтор темы

  • ADN Club
  • Сообщений: 31
  • Карма: 2
Здравствуйте. Пытаюсь написать годное приложение-плагин для AutoCAD 2012, которое должно представлять из себя в конечном итоге диалог на WPF, с помощью которого можно будет редактировать графические примитивы и слои.

Столкнулся со следующей проблемой: не получается отображать ObjectID в listView на UserControl.

Попробовал реализовать данную задачу следующим образом:
1. Добавил класс TreeView (название такое, т.к. в конечном итоге планирую группировать объекты в дереве по слоям) у которого есть свойство
ObjectId:

Код - C# [Выбрать]
  1. class TreeItemsModel
  2.     {
  3.         public string ObjectId { get; set; }
  4.     }

2. Добавил listView на UserControl, прописал для него нужные binding:

Код - Text [Выбрать]
  1. <ListView ItemsSource="{Binding Path=Items, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
  2.             <ListView.View >
  3.                 <GridView>
  4.                     <GridViewColumn Width="120"  Header="ID Объекта" DisplayMemberBinding="{Binding Path=ObjectId}"/>
  5.                 </GridView>
  6.             </ListView.View>
  7.         </ListView>

3. Во ViewModel реализовал интерфейс INotifyPropertyChanges, для обновления listView, а также добавил нужные свойства, + добавил метод, который добавляет элемент в коллекцию ObservableCollection<TreeItemsModel>

Код - C# [Выбрать]
  1. class MainUserControlViewModel : INotifyPropertyChanged
  2.     {
  3.  
  4.         #region INotifyPropertyChanged Members
  5.        
  6.         public event PropertyChangedEventHandler PropertyChanged;
  7.         public void OnPropertyChanged(string propertyName)
  8.         {
  9.             if (PropertyChanged != null)
  10.             {
  11.                 PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
  12.                 MessageBox.Show(propertyName);
  13.             }
  14.         }
  15.  
  16.         #endregion INotifyPropertyChanged Members
  17.  
  18.         private ObservableCollection<TreeItemsModel> _items;
  19.  
  20.        
  21.         public ObservableCollection<TreeItemsModel> Items
  22.         {
  23.             get { return _items; }
  24.             set
  25.             {
  26.                
  27.                 if (_items == value) return;
  28.                 _items = value;
  29.                 OnPropertyChanged("Items");
  30.             }
  31.         }
  32.  
  33.         public void AddElementToTree(TreeItemsModel element)
  34.         {
  35.             Items.Add(element);
  36.             MessageBox.Show(Items.Count.ToString() + " ID = " + element.ObjectId);
  37.         }
  38. }

4. Написал команду, которая блокирует текущий файл .draw и позволяет заполнить коллекцию во ViewModel

Код - C# [Выбрать]
  1. [CommandMethod("AddItemToCollection")]
  2.         public static void AddItemToCollection()
  3.         {
  4.             acDoc = Application.DocumentManager.MdiActiveDocument;
  5.             acCurDB = acDoc.Database;
  6.  
  7.             using (acDoc.LockDocument())
  8.             {
  9.                 using (acTrans = acCurDB.TransactionManager.StartTransaction())
  10.                 {
  11.                     PromptSelectionResult acSSPromt = acDoc.Editor.SelectAll();
  12.  
  13.                     if (acSSPromt.Status == PromptStatus.OK)
  14.                     {
  15.                         SelectionSet acSSet = acSSPromt.Value;
  16.  
  17.                         MainUserControlViewModel uc = new MainUserControlViewModel();
  18.                         uc.Items = new ObservableCollection<TreeItemsModel>();
  19.  
  20.                         foreach (SelectedObject acSObj in acSSet)
  21.                         {
  22.                             if (acSObj != null)
  23.                             {
  24.                                 uc.AddElementToTree(new TreeItemsModel() { AutoCadObject = acSObj ,Caption = acSObj.ObjectId.ToString()});
  25.                             }
  26.                         }
  27.                     }
  28.                 }
  29.             }
  30.         }

В процессе отладки обнаружил, что коллекция заполняется корректно, в нее добавляются объекты и их ID, однако в диалоговом окне listView никак не реагирует на заполнение коллекции, добавленные элементы я не могу наблюдать

Как можно решить данную проблему?

Понимаю, что данный вопрос в большей степени может относится к data Binding в MVVM и реализации INotifyPropertyChanges, однако прошу Вас поделится опытом работы с объектами autoCAD, их отображения через контролы WPF. Буду рад любому источнику, который поможет разобраться с данной проблемой. Наверняка кто-то сталкивался с подобной проблемой, или же знает более оптимальный и верный способ.

« Последнее редактирование: 04-02-2015, 21:21:49 от Даниил »

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78

Оффлайн ДаниилАвтор темы

  • ADN Club
  • Сообщений: 31
  • Карма: 2
Прошу прощения, файл с расширением dwg
я работаю с текущим открытым dwg файлом в рабочем окне AutoCAD

Отмечено как Решение Даниил 13-02-2015, 14:54:24

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Столкнулся со следующей проблемой: не получается отображать ObjectID в listView на UserControl.
не вижу никакой проблемы. Сейчас у меня под рукой нет AutoCAD. Глянь это - там я на скрине в списке показываю отображение точек по выбранной трассе. Исходный код примера там же.

Оффлайн ДаниилАвтор темы

  • ADN Club
  • Сообщений: 31
  • Карма: 2
Спасибо Вам, скачал исходник, буду разбираться)