Подтвердить что ты не робот

CompositeCollection + CollectionContainer: Bind CollectionContainer.Collection для свойства ViewModel, который используется как DataTemplates DataType

Я не получаю правильный синтаксис Binding для доступа к свойствам Cats и Dogs MyViewModel в пределах DateTemplate, который определяет CompositeCollection в своих ресурсах.

public class MyViewModel
{
    public ObservableCollection<Cat> Cats { get; private set; }
    public ObservableCollection<Dog> Dogs { get; private set; }
}
<DataTemplate DataType={x:Type local:MyViewModel}">
  <DataTemplate.Resources>
    <CompositeCollection x:Key="MyColl">
      <!-- How can I reference the Cats and Dogs properties of MyViewModel? -->
      <CollectionContainer Collection="{Binding Dogs, ????}">
      <CollectionContainer Collection="{Binding Cats, ????}">
    </CompositeCollection>
  </DataTemplate.Resources>
  <ListBox ItemsSource="{StaticResource MyColl}">
    <!-- ... -->
  </ListBox>
</DataTemplate>

Что мне нужно вставить для???? привязать коллекции Dogs и Cats к CollectionContainer s?

4b9b3361

Ответ 1

Из-за проблемы с привязкой данных к CollectionContainer, как описано http://social.msdn.microsoft.com/Forums/vstudio/en-US/b15cbd9d-95aa-47c6-8068-7ae9f7dca88a/collectioncontainer-does-not-support-relativesource?forum=wpf Теперь я использую следующий подход:

<ListBox>
  <ListBox.Resources>
    <CollectionViewSource x:Key="DogCollection" Source="{Binding Dogs}"/>
    <CollectionViewSource x:Key="CatCollection" Source="{Binding Cats}"/>
  </ListBox.Resources>
  <ListBox.ItemsSource>
    <CompositeCollection>
      <CollectionContainer Collection="{Binding Source={StaticResource DogCollection}}"/>
      <CollectionContainer Collection="{Binding Source={StaticResource CatCollection}}"/>
    </CompositeCollection>
  </ListBox.ItemsSource>
  <!-- ... -->
</ListBox>

Изменить: Класс CompositeCollection не выводится из FrameworkElement и, следовательно, не имеет свойства DataContext для поддержки привязки данных. Он будет работать, только если вы используете Binding, предоставляя Source. Подробнее см. fooobar.com/questions/109805/....

Ответ 2

Попробуйте указать имя в ListBox и перечислите его DataContext в привязке:

   <ListBox x:Name="myList" ItemsSource="{DynamicResource MyColl}">
        <ListBox.Resources>
            <CompositeCollection x:Key="MyColl">

                 <CollectionContainer Collection="{Binding DataContext.Dogs, Source={x:Reference myList}}"/>
                <CollectionContainer Collection="{Binding DataContext.Cats, Source={x:Reference myList}}"/>
            </CompositeCollection>
        </ListBox.Resources>
    </ListBox>