C# 在带有MVVM灯光的usercontrols中使用相同的x:Name
我在WPF应用程序中使用MVVM Light。 我有一些用户控制。它通过elementname将元素作为commandparameter传递给commandC# 在带有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}"
<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之间的分离。