在Silverlight中将内部ViewModel连接到UserControls

时间:2010-08-10 12:50:16

标签: silverlight silverlight-4.0

我正在尝试显示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?

1 个答案:

答案 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>