2012-10-05 5 views
1

У меня есть ComboBox, который имеет связанный источник пунктов ... Я раздели мой пример вниз ключевых элементов:Как преобразовать ComboBox для использования связанного CompositeCollection?

<UserControl x.Class="My.Application.ClientControl" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"       
      xmlns:conv="clr-namespace:My.Utilities.Converters" 
      Name="ClientControl"> 

    <UserControl.Resources> 
     <ResourceDictionary> 
      <CollectionViewSource Key="x:ClientsCollection" /> 
     </ResourceDictionary> 

     <conv:ClientOptions x:Key="ClientOptions" /> 

    </UserControl.Resources> 

    ... 

    <ComboBox Name="Options" 
       DataContext="ClientsCollection" 
       ItemsSource="{Binding [ClientNumber], Converter={StaticResource ClientOptions}" /> 

</UserControl> 

Это работает, но теперь я хочу, чтобы добавить один ручной элемент в мой выпадающий список которые будут вызывать альтернативную функцию, называемую «Other ...», так что я, чтобы двигаться к использованию CompositeCollection ... как так:

<ComboBox Name="Options" 
      DataContext="ClientsCollection"> 
    <ComboBox.ItemsSource> 
     <CompositeCollection> 

      <CollectionContainer Collection="{Binding [ClientNumber], Converter={StaticResource ClientOptions} /> 
      <ComboBoxItem>Other...</ComboBoxItem> 
     </CompositeCollection> 
</ComboBox> 

Try как я мог, то связанные элементы просто не заполнять, если используя CompositeCollection. Он показывает только ручной ComboBoxItem «Другое ...». Если я удалю этот элемент, список пуст. Если я привяжу точку останова к конвертеру, он ничего не поймает, что указывает на то, что привязка даже не пыталась.

Я, очевидно, не понимаю, как происходит функция привязки в CompositeCollection. Может ли кто-нибудь увидеть ошибку в моем XAML или объяснить, что мне не хватает?

ответ

1

Объявление CompositeCollection в ComboBox.Resources и использование его с ItemsSource = "{Binding Source = {StaticResource myCompositeCollection}}".

<UserControl x.Class="My.Application.ClientControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"       
     xmlns:conv="clr-namespace:My.Utilities.Converters" 
     Name="ClientControl"> 

<UserControl.Resources> 
    <ResourceDictionary> 
     <CollectionViewSource Key="x:ClientsCollection" /> 
    </ResourceDictionary> 

    <conv:ClientOptions x:Key="ClientOptions" /> 
    <CompositeCollection x:Key="myCompositeCollection"> 

     <CollectionContainer Collection="{Binding Source={StaticResource ClientsCollection}, Path=[ClientNumber], Converter={StaticResource ClientOptions} /> 
     <ComboBoxItem>Other...</ComboBoxItem> 
    </CompositeCollection> 

</UserControl.Resources> 

... 

<ComboBox Name="Options" 
      DataContext="ClientsCollection" 
      ItemsSource="{Binding Source={StaticResource myCompositeCollection}}" /> 

Если вы объявляете CompositeCollection внутри свойства ItemsSource в синтаксисе элемента связывания для CollectionContainer.Collection не находит DataContext.

В разделе «Ресурсы» Freezables, такие как CompositeCollection, наследуют DataContext своего объявляющего элемента, как если бы они были логическими дочерними элементами этого элемента. Однако это специальность свойства и свойств ресурсов, таких как ContentControl.Content или аналогичные свойства, которые содержат логические дочерние элементы элемента управления (и, возможно, несколько других). Если вы используете синтаксис элемента для установки значения свойства, в общем случае вам следует ожидать, что наследование свойств свойств для таких свойств, как DataContext, не работает, и поэтому привязки без явного источника также не будут работать.

+0

Можете ли вы сформулировать свой ответ немного ... если я переведу его в раздел «Ресурсы» и задаю свой ItemSource = {Binding Source = {StaticResource ...}}, как мне установить контекст моего CollectionContainer? – BobTheBuilder

+0

см. Мой отредактированный ответ ... – hbarck

+0

Итак ... мой ComboBox в настоящее время связан с контекстом данных ... мой ClientsCollection; мой ComboBox.ItemsSource привязан к списку параметров, которые будут меняться в зависимости от выбранного в настоящий момент клиента в моем ClientsCollection. Где я могу определить эту взаимосвязь [контекст]? В ресурсах или со списках? Можете ли вы опубликовать фрагмент кода для уточнения? – BobTheBuilder

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

  • Нет связанных вопросов^_^