如何使用WPF Path对象保持MVVM模式?

时间:2014-03-06 20:05:32

标签: c# wpf mvvm command

在WPF应用程序中,我得到了一个包含多个Path对象的Canvas对象。我需要点击那些路径上的东西,即VM中的东西。路径上没有命令,例如Button。最好的方法是什么? 到目前为止我的解决方案是:

  1. 要在后面的视图代码上创建MouseDown处理程序以捕获我的路径,请单击
  2. 从此处发送消息
  3. 在目标VM上注册此消息类型,以便执行我的业务代码。
  4. 对我来说这似乎有点矫枉过正,你有什么看法?你看到更简洁的方法吗?

    非常感谢!

2 个答案:

答案 0 :(得分:1)

您可以Button使用Path作为Template

<Button Command="{Binding MyCommand}">
    <Button.Template>
        <ControlTemplate TargetType="{x:Type Button}">
            <Path ... />
        </ControlTemplate>
    </Button.Template>
</Button>

答案 1 :(得分:0)

只是添加关于我上次评论的补充信息......定位ItemTemplate的正确方法是在ItemsControl.ItemContainerStyle中设置ContentPresenter的样式。您将在下面找到我最终正在使用的代码:

<UserControl.Resources>
    <Style x:Key="PathStyle" TargetType="Button">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Path Data="{Binding Data}" 
                          StrokeStartLineCap="Round" 
                          Stretch="Fill" 
                          StrokeEndLineCap="Round" 
                          Stroke="{DynamicResource selectedZoneBorderColor}" 
                          StrokeLineJoin="Round" 
                          Width="{Binding Path=Width}"
                          Height="{Binding Path=Height}"
                          Fill="{DynamicResource selectedZoneColor}" 
                          Panel.ZIndex="1" 
                          StrokeThickness="3" />
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</UserControl.Resources>
<ItemsControl Name="zonesContainer" ItemsSource="{Binding Zones}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <Canvas Grid.Column="1" />
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Button 
                            Style="{StaticResource ResourceKey=PathStyle}"
                            Command="{Binding ElementName=zonesContainer, 
                                                Path=DataContext.ActivateZone}"
                            CommandParameter="{Binding Id}"
                        />
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
                <ItemsControl.ItemContainerStyle>
                    <Style TargetType="ContentPresenter">
                        <Setter Property="Canvas.Left" Value="{Binding Path=Left}" />
                        <Setter Property="Canvas.Top" Value="{Binding Path=Top}" />
                    </Style>
                </ItemsControl.ItemContainerStyle>
            </ItemsControl>

所有这一切都有相应的VM暴露一个ObservableCollection,一个Zone类暴露所有内部道具(宽度,高度,顶部,左边......)。

您可以详细说明答案here