在wpf中将代码的代码转移到viewmodel

在wpf中将代码的代码转移到viewmodel,wpf,mvvm,icommand,Wpf,Mvvm,Icommand,以下是我的代码: private void Button_Click(object sender, RoutedEventArgs e) { foreach (FrameworkElement fe in canvas.Children) { double top = (double)fe.GetValue(Canvas.TopProperty); do

以下是我的代码:

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            foreach (FrameworkElement fe in canvas.Children)
            {
                double top = (double)fe.GetValue(Canvas.TopProperty);
                double left = (double)fe.GetValue(Canvas.LeftProperty);
            }
        }
“canvas”是我的canvas控件在XAML中的名称。当前的代码使我能够获取画布中图像的位置。这是在代码隐藏中实现的。问题是,我们如何以MVVM方式获取图像的位置(使用命令启动该过程)

我们如何以MVVM方式获取图像的位置(使用命令启动该过程)

不需要命令,只需将每个画布的每个所需属性绑定到VM即可。然后在需要时提取获取图像所需的目标画布属性

我们如何以MVVM方式获取图像的位置(使用命令启动该过程)


不需要命令,只需将每个画布的每个所需属性绑定到VM即可。然后在需要时提取获取图像所需的目标画布属性。

一个好的解决方案是使用XAML行为:

<Canvas x:Name="Canvas">
 <i:Interaction.Triggers>
     <i:EventTrigger EventName="Click">
          <i:InvokeCommandAction Command="{Binding YourCommand}" 
                                 CommandParameter="{Binding ElementName=canvas}"/>
      </i:EventTrigger>
  </i:Interaction.Triggers> 
</Canvas>


通过这种方式,您可以在
视图模型中访问
画布
,并可以在命令中执行隐藏的代码。

一个好的解决方案是使用XAML行为:

<Canvas x:Name="Canvas">
 <i:Interaction.Triggers>
     <i:EventTrigger EventName="Click">
          <i:InvokeCommandAction Command="{Binding YourCommand}" 
                                 CommandParameter="{Binding ElementName=canvas}"/>
      </i:EventTrigger>
  </i:Interaction.Triggers> 
</Canvas>


通过这种方式,您可以在
ViewModel
中访问
Canvas
,并可以在命令中执行隐藏的代码。

您将
ElementName
设置为“Canvas”,但
Canvas
没有名称……这是打字错误吗?在问题中,它说:“canvas”是我的canvas控件在XAML中的名称。这是名称。很公平,然后将示例canvas命名为相同的名称。对吗?只是为了澄清一下。:-)是的,你是对的:)我修改了答案。谢谢你将
ElementName
设置为“canvas”,但是
canvas
没有名称……这是打字错误吗?在问题中它说:”“canvas”是我的canvas控件在XAML中的名称。这是一个名称。很公平,然后将示例canvas命名为相同的名称。对吗?只是为了澄清一下。:-)是的,你是对的:)我修改了答案。谢谢