我正在尝试显示Notes列表。我有一个ItemsControl绑定到NoteViewModel的集合。因此,在items控件的数据模板中,我想创建一个NoteControl(用于显示注释的用户控件),并将其ViewModel属性绑定到集合中的NoteViewModel。
我目前有这个:
<ItemsControl x:Name="itemsControl1" Grid.Row="1" ItemsSource="{Binding Notes}" >
<ItemsControl.Template>
<ControlTemplate TargetType="ItemsControl">
<ScrollViewer>
<ItemsPresenter/>
</ScrollViewer>
</ControlTemplate>
</ItemsControl.Template>
<ItemsControl.ItemTemplate>
<DataTemplate>
<uc:NoteControl uc:NoteControl.ViewModel="{Binding}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
但我得到了这个例外:
System.ArgumentException: Object of type 'System.Windows.Data.Binding' cannot be converted to type 'NotePrototype.NoteViewModel'.
连接这个的正确语法是什么?是否有更好的技术将内部ViewModel连接到动态创建/绑定的内部UserControl?
答案 0 :(得分:1)
最好将ViewModel附加到UserControl的DataContext,而在用户控件中不需要ViewModel属性,您只需绑定到隐式Datacontext,因为那将是ViewModel
额外说明: 要在设计器中启用数据绑定,请遵循以下示例:
<UserControl
<!--
all the other declaration needed are here
-->
xmlns:local="clr-namespace:NotePrototype"
d:DataContext="{DynamicResource ViewModel}"
>
<UserControl.Resources>
<local:NoteViewModel x:Key="ViewModel" d:IsDataSource="True" />
</UserControl.Resources>
<!--
put your content here
-->
</UserControl>
编辑了ItemsControl的示例:
<ItemsControl x:Name="itemsControl1" Grid.Row="1" ItemsSource="{Binding Notes}" >
<ItemsControl.Template>
<ControlTemplate TargetType="ItemsControl">
<ScrollViewer>
<ItemsPresenter/>
</ScrollViewer>
</ControlTemplate>
</ItemsControl.Template>
<ItemsControl.ItemTemplate>
<DataTemplate>
<uc:NoteControl DataContext="{Binding}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>