Не уверен, что это все еще актуально ... недавно была похожая проблема - я все еще где-то на кривой обучения WPF , просто не совсем уверен, где ...
В любом случае, вот сценарий: я хотел бы создать объект типа ObservableCollection где-нибудь в моем локальном пространстве имен (для простоты), например ..
public class NodesCollection : ObservableCollection<Nodes> { }
Затем из Blend / Xaml я могу легко «Создать источник данных объекта» (из панели инструментов «Данные») и найти, что NodesCollection
отображается и может быть выбрано.
Затем Blend создаст локальный ресурс в верхней части файла Xaml, аналогично:
<local:NodesCollection x:Key="NodesCollectionDataSource" d:IsDataSource="True" />
С этим вы можете легко привязать свойство ItemsSource
списка к источнику данных, который мы только что создали. Например, щелкните правой кнопкой мыши по списку на панели инструментов «Объекты и временная шкала» и выберите «Привязать данные к элементу Источники данных». Во всплывающем диалоговом окне вы увидите, что NodesCollectionDataSource
доступен и может использоваться. *
Однако здесь возникают проблемы, которые мне пришлось решить ...
В некоторых книгах, которые я читаю в данный момент, они говорят о создании CollectionViewSource в Xaml, который можно использовать для сортировки / группировки / фильтрации / навигации по исходному источнику данных.
Первая проблема, я не могу найти CollectionViewSource нигде в Blend; поэтому единственный вариант - создать тег в Xaml вручную.
Просто введите <CollectionViewSource x:Key="cvsNodes" />
в блоке ресурсов (Xaml), и оттуда вы можете изменять дополнительные свойства, используя Blend GUI; например, установка основного свойства Source и дополнительных дескрипторов Sort и Group (находится на панели инструментов Resources).
Теперь наступает момент, когда мы хотим связать свойство ItemsBource ListBox с CollectionViewSource. Однако вы не сможете найти этот предмет, используя Blend GUI. Поэтому вы должны ввести значение привязки вручную. Например:
<ListBox x:Name=.. ItemsSource="{Binding Source={DynamicResource cvsNodes}}".. />
Это работает. Но чтобы сделать это еще проще, нам нужно вернуться к исходному элементу ресурса CollectionViewSource в Xaml и добавить дополнительный атрибут:
<CollectionViewSource x:Key="cvsNodes" Source=... d:IsDataSource="True"
d:IsDataSource="True"
позволяет добиться того, чтобы Blend GUI распознал этот ресурс как доступный для использования.
Теперь, если мы вернемся к свойству ItemsSource в ListBox на панели инструментов Свойства, мы сможем выбрать cvsNodes
из списка доступных источников данных.
Надеюсь, это поможет любому, кто, возможно, пришёл к тому же выводу, что и я, что Blend и лежащая в основе технология Xaml не полностью синхронизированы; и что Blend в лучшем случае является инструментом для создания Xaml, а не заменой для изучения языка Xaml.