我有一个TreeView数据绑定到CollectionViewSource Groups集合。这样我就可以使用CollectionViewSource的强大功能显示数据,而数据本身也有层次结构,这就是我需要TreeView的原因。我有第二个控件绑定到TreeView的SelectedItem。
问题是当选择组标题时,程序会崩溃并出现以下异常。
{"A TwoWay or OneWayToSource binding cannot work on the read-only property 'Name' of type 'MS.Internal.Data.CollectionViewGroupInternal'."}
TreeView中的对象包含一个Name属性,该属性在另一个控件中是双向绑定的。绑定引擎似乎找到了Group的Name属性并尝试绑定到该属性。如何防止发生此异常?我希望我的程序的其余部分可以将其视为选择组标题时没有选择任何内容,或者不允许一起选择组标题。下面是代码的简化版本。
<TreeView
x:Name="CustomersTree"
ItemsSource="{Binding CustomersViewSource.Groups}"
ItemTemplate="{StaticResource CustomerGroupsTemplate}">
<MyUserControl DataContext="{Binding ElementName=CustomersTree, Path=SelectedItem, Mode=OneWay}" />
<HierarchicalDataTemplate x:Key="CustomerGroupsTemplate" ItemsSource="{Binding Path=Items}" ItemTemplate="{StaticResource CustomerTreeItemTemplate}">
<TextBlock Text="{Binding Path=Name}"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="CustomerTreeItemTemplate" ItemsSource="{Binding Customers}">
<StackPanel>
<Image Source="{Binding ImageSource}" />
<TextBlock Text="{Binding Path=Name}" />
</StackPanel>
</HierarchicalDataTemplate>
要清楚,错误是CustomerGroupsTemplate中绑定的结果,据我所知,将此绑定更改为OneWay会导致相同的错误。树中的信息显示了预期的方式,只有在选择了组头时才会发生异常。
答案 0 :(得分:0)
问题是用户控件中双向绑定的结果。我最终使用转换器来检查被绑定对象的类型,如果它不是我想要的对象,则忽略它。