C# 在带有MVVM灯光的usercontrols中使用相同的x:Name

C# 在带有MVVM灯光的usercontrols中使用相同的x:Name,c#,wpf,mvvm,mvvm-light,C#,Wpf,Mvvm,Mvvm Light,我在WPF应用程序中使用MVVM Light。 我有一些用户控制。它通过elementname将元素作为commandparameter传递给command <UserControl> <i:Interaction.Triggers> <i:EventTrigger EventName="Loaded"> <cmd:EventToCommand Command="{Binding LoadCommand}"

我在WPF应用程序中使用MVVM Light。 我有一些用户控制。它通过elementname将元素作为commandparameter传递给command

<UserControl>
<i:Interaction.Triggers>
        <i:EventTrigger EventName="Loaded">
            <cmd:EventToCommand Command="{Binding LoadCommand}"     CommandParameter="{Binding ElementName=Image}"></cmd:EventToCommand>
        </i:EventTrigger>
    </i:Interaction.Triggers>
<image Name="Image" />
</UserControl>
在我的主视图中,我使用以下用户控件:

<Window>
  <l:mycontrol />
  <l:mycontrol />
</Window>
视图模型

 class MainViewModel:ViewModelBase
 {
    public MainViewModel()
    {
       LoadCommand = new RelayCommand<Image>(OnLoad);
    }

    private void OnLoad(Image image)
    {
       Draw(image,bitmap);
    }
 }
Draw是我用一些usercontrol参数在图像上书写的函数。 由于图像具有相同的x:name,我的应用程序仅在最后一个图像上绘制。
还有什么方法可以将元素传递给命令?

您是否尝试过在窗口元素中为控件赋予不同的x:Name属性?如果有固定数量的用户控件,更改名称是最简单的方法。在处理这样的控件时,您需要稍微谨慎一点——通过处理ViewModel中的界面元素和绘图方法,您正在打破MVVM模式。当我以前这样做时,我使用Messenger类从VM向View codebehind发送一条“DoSomething”消息。收到该消息会触发一个代码隐藏方法,该方法执行用户界面更改。这将保持业务逻辑和UI之间的分离。