Здравствуйте. Пытаюсь написать годное приложение-плагин для AutoCAD 2012, которое должно представлять из себя в конечном итоге диалог на WPF, с помощью которого можно будет редактировать графические примитивы и слои.
Столкнулся со следующей проблемой: не получается отображать ObjectID в listView на UserControl.
Попробовал реализовать данную задачу следующим образом:
1. Добавил класс TreeView (название такое, т.к. в конечном итоге планирую группировать объекты в дереве по слоям) у которого есть свойство
ObjectId:
class TreeItemsModel
{
public string ObjectId { get; set; }
}
2. Добавил listView на UserControl, прописал для него нужные binding:
<ListView ItemsSource="{Binding Path=Items, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<ListView.View >
<GridView>
<GridViewColumn Width="120" Header="ID Объекта" DisplayMemberBinding="{Binding Path=ObjectId}"/>
</GridView>
</ListView.View>
</ListView>
3. Во ViewModel реализовал интерфейс INotifyPropertyChanges, для обновления listView, а также добавил нужные свойства, + добавил метод, который добавляет элемент в коллекцию ObservableCollection<TreeItemsModel>
class MainUserControlViewModel : INotifyPropertyChanged
{
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
MessageBox.Show(propertyName);
}
}
#endregion INotifyPropertyChanged Members
private ObservableCollection<TreeItemsModel> _items;
public ObservableCollection<TreeItemsModel> Items
{
get { return _items; }
set
{
if (_items == value) return;
_items = value;
OnPropertyChanged("Items");
}
}
public void AddElementToTree(TreeItemsModel element)
{
Items.Add(element);
MessageBox.Show(Items.Count.ToString() + " ID = " + element.ObjectId);
}
}
4. Написал команду, которая блокирует текущий файл .draw и позволяет заполнить коллекцию во ViewModel
[CommandMethod("AddItemToCollection")]
public static void AddItemToCollection()
{
acDoc = Application.DocumentManager.MdiActiveDocument;
acCurDB = acDoc.Database;
using (acDoc.LockDocument())
{
using (acTrans = acCurDB.TransactionManager.StartTransaction())
{
PromptSelectionResult acSSPromt = acDoc.Editor.SelectAll();
if (acSSPromt.Status == PromptStatus.OK)
{
SelectionSet acSSet = acSSPromt.Value;
MainUserControlViewModel uc = new MainUserControlViewModel();
uc.Items = new ObservableCollection<TreeItemsModel>();
foreach (SelectedObject acSObj in acSSet)
{
if (acSObj != null)
{
uc.AddElementToTree(new TreeItemsModel() { AutoCadObject = acSObj ,Caption = acSObj.ObjectId.ToString()});
}
}
}
}
}
}
В процессе отладки обнаружил, что коллекция заполняется корректно, в нее добавляются объекты и их ID, однако в диалоговом окне listView никак не реагирует на заполнение коллекции, добавленные элементы я не могу наблюдать
Как можно решить данную проблему?
Понимаю, что данный вопрос в большей степени может относится к data Binding в MVVM и реализации INotifyPropertyChanges, однако прошу Вас поделится опытом работы с объектами autoCAD, их отображения через контролы WPF. Буду рад любому источнику, который поможет разобраться с данной проблемой. Наверняка кто-то сталкивался с подобной проблемой, или же знает более оптимальный и верный способ.