命令绑定在所有ViewModels实例中执行的datatemplate中

时间:2011-01-25 12:21:10

标签: .net wpf mvvm command datatemplate

WPF中的命令和数据窗口有问题,我不知道它是错误还是正常行为。

我有一个包含listview的CustomControl。此控件用于多个视图(UserControl的实例)。控件中包含的listview的datatemplate是:

<DataTemplate x:Key="StandardContentDisplayDataTemplate">
    <Grid d:DesignWidth="193.333" d:DesignHeight="128.036" Margin="25">
        <Button Style="{Binding ItemButtonStyle, RelativeSource={RelativeSource AncestorType={x:Type Control:ContentDisplay}}}" 
            Margin="0" 
            VerticalContentAlignment="Stretch" 
            HorizontalContentAlignment="Center"
            Command="{Binding DataContext.ItemTouchCommand, RelativeSource={RelativeSource AncestorType={x:Type Control:ContentDisplay}}}"
            CommandParameter="{Binding Id}"
            Background="{Binding HexadecimalColor, FallbackValue=#FFAAAA}" BorderThickness="0" HorizontalAlignment="Stretch" Padding="0">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="1*"/>
                    <RowDefinition Height="3*"/>
                </Grid.RowDefinitions>
                <TextBlock Text="{Binding Name, FallbackValue=Mon Item}" HorizontalAlignment="Center" VerticalAlignment="Center" ToolTipService.ToolTip="{Binding Name}" FontSize="14.667" Margin="0" Grid.Row="0"/>
                <Image Margin="1,0,1,1" Grid.Row="1" VerticalAlignment="Stretch" Source="{Binding ImageUrl, FallbackValue=/logo.png, TargetNullValue=/logont.png}" Stretch="Uniform" />
            </Grid>
        </Button>
    </Grid>
</DataTemplate>

我所做的是将命令绑定到ContentDisplay(我的CustomControl)的datacontext,也就是我的ViewModel。

链接到此命令的操作是导航到包含相同控件的另一个视图以及其ViewModel中的命令,以相同的方式绑定(它总共有3个级别)。

当我点击顶层视图中的按钮时,它会正确导航到第二级视图,显示其他项目。但是当ViewModel实例化并且Command绑定到listview中的项目时,将再次调用Command,并且一次又一次地调用Command。 我的理论是,DataTemplate在绑定命令时会通知其所有父节点(所有实例)。但也许我的代码中有一个错误。

这种行为是正常的吗?如果是的话,有没有办法以MVVM尊重的方式做我想要达到的目标?

提前感谢您的回复

1 个答案:

答案 0 :(得分:1)

问题就在这里:

 Command="{Binding DataContext.ItemTouchCommand, RelativeSource={RelativeSource AncestorType={x:Type Control:ContentDisplay}}}"

您的命令绑定到ContentDisplay的ViewModel。我建议使用你的DataTemplate并使用自己的后台ViewModel创建一个UserControl(在该ViewModel上使用ItemTouchCommand)。在UserControl上公开依赖属性,该属性采用正在显示的Item的类型。然后你可以改变你的datatemplate来简单地保存那个控件的实例

<DataTemplate x:Key="StandardContentDisplayDataTemplate">
    <Control:ItemDisplayControl Item="{Binding}"/>
</DataTemplate>