C# 复合采集&x2B;CollectionContainer:将CollectionContainer.Collection绑定到用作DataTemplates数据类型的ViewModel属性
我没有获得正确的绑定语法来访问C# 复合采集&x2B;CollectionContainer:将CollectionContainer.Collection绑定到用作DataTemplates数据类型的ViewModel属性,c#,wpf,data-binding,datatemplate,compositecollection,C#,Wpf,Data Binding,Datatemplate,Compositecollection,我没有获得正确的绑定语法来访问MyViewModel的Cats和Dogs属性,该属性位于定义其资源中的CompositeCollection的日期模板中 public class MyViewModel { public ObservableCollection<Cat> Cats { get; private set; } public ObservableCollection<Dog> Dogs { get; private set; } } 公共类
MyViewModel
的Cats
和Dogs
属性,该属性位于定义其资源中的CompositeCollection
的日期模板中
public class MyViewModel
{
public ObservableCollection<Cat> Cats { get; private set; }
public ObservableCollection<Dog> Dogs { get; private set; }
}
公共类MyViewModel
{
公共可观测集合猫{get;private set;}
公共可观察收集狗{get;private set;}
}
尝试为您的列表框
命名,并在绑定中引用其数据上下文
:
<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>
由于所述的CollectionContainer
上的数据绑定问题,我现在使用以下方法:
<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
属性。只有使用绑定
提供源代码
时,它才会起作用。查看此处了解更多信息。这不起作用。我得到一个异常,列表框的名称无法解析。我认为这是因为CompositeCollection
是在DataTemplate.Resources
中声明的,而ListBox
是在后面声明的。这只是一个建议。。为什么要在模板资源中收集。。您可以将其移动到列表框资源中吗?如果我将CompositeCollection
移动到ListBox.resources
,那么如何将其引用为ListBox.ItemsSource
?而不是StaticResource use{DynamicResource MyColl}
如果您将collectin放入列表框资源并使用DynamicSource引用它,它不会给出周期性错误。。。刚刚测试过这个。。。工作很好。。用测试代码更新了答案这对我来说非常有用。但如果你能解释一下为什么需要这样做,那会更有帮助。我不明白:1)为什么我不能以同样的方式声明CollectionContainer
资源并直接使用它,而不是通过CollectionViewSource
间接使用它?2)为什么我不能将CompositeCollection
声明为一个资源,并直接绑定到其中的CollectionContainer
对象?CollectionViewSource
有什么特别之处,即使在其他类型不起作用的情况下,它也能在这里工作?