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尊重的方式做我想要达到的目标?
提前感谢您的回复
答案 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>