2015-06-03 2 views
0

У меня есть представление с viewmodel, поскольку это DataContext. В ViewModel У меня есть ObservableCollection объектов:Binding ItemsSource для ObservableCollection в классе обертки

AvailableCategories = new ObservableCollection<Category>(); 

Я могу связать ListView к этому ObservableCollection без каких-либо проблем, как это:

ItemsSource="{Binding Path=AvailableCategories}" 

теперь у меня есть требование, чтобы обернуть ObservableCollection в классе (для помощи в XML-сериализации, как здесь: How to rename XML attribute that generated after serializing List of objects)

класс обертка выглядит следующим образом:

public class CategoryList : ObservableObject 
    { 
    private ObservableCollection<Category> _categories; 
    public ObservableCollection<Category> Categories 
    { 
      get 
      { 
       return _categories; 
      } 
      set 
      { 
       if (_categories == value) 
       { 
        return; 
       } 
       _categories = value; 
       RaisePropertyChanged(()=>Categories); 

      } 
     } 
    } 

и она будет создана в VM, как это:

 CategoryList cl = new CategoryList(); 
     cl.Categories = new ObservableCollection<Category>(); 

Как я теперь привязать к коллекции внутри класса-оболочки в моей виртуальной машине? Это, похоже, не работает:

ItemsSource="{Binding cl.Categories}" 

; EDIT: My VM Теперь выставляет CategoryList так:

private CategoryList _cl; 
    public CategoryList cl 
    { 
     get 
     { 
      return _cl; 
     } 
     set 
     { 
      if (value==_cl) 
      { 
       return; 
      } 
      _cl = value; 
      RaisePropertyChanged(()=>cl); 
     } 
    } 

Но до сих пор нет радости.

+0

Ваша модель просмотра должна показывать свойство типа CategoryList, например. 'public CategoryList CategoryList {get; } '. Затем вы привязываетесь к 'CategoryList.Categories'. – Clemens

+0

Посмотрите на ** Выходное окно ** для подсказок. Похоже, что контекст данных не может быть установлен или неверен. –

+0

Если я не переношу класс и не использую коллекцию напрямую, он отлично работает, поэтому я думал, что это может быть связано с синтаксисом XAML. Окно вывода не вызывает ничего подозрительного. – jidl

ответ

-1

Попробуйте подписаться на событие cl.PropertyChanged на вашей виртуальной машине и в вызове обработчика RaisePropertyChanged(()=>cl) (вы можете сначала проверить e.PropertyName, если хотите, чтобы избежать слишком большого количества вызовов). Если это работает, это означает, что ваше представление не уведомляется, когда свойство коллекции изменяется, потому что вы привязываетесь к подзадачу.

Если это не сработает, возможно, вам придется подписаться на Categories.CollectionChanged, а также изменить значение свойства cl из этого обработчика ... Если это работает, это означает, что элементы коллекции меняются (добавляются или удален), что не уведомляется о представлении.

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

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

+0

Спасибо - я посмотрю. Если это не рекомендуется, я предпочел бы сделать это по-другому, но все равно нужно выполнить сериализацию - возможно, я скопирую список на другой объект и сериализую его. – jidl

Смежные вопросы