如何绑定/连接到具有自己的viewModel的不同视图?
我有一个mainWindow,它包含用户控件/视图。每个都有自己的viewModel。第一个视图就像一个控制面板,其中有一个表单可以输入应用程序的输入参数。另一个是画布,用于根据控制面板上的输入参数显示分析结果。
示例:
主窗口:
<StackPanel Orientation="Horizontal" Margin="0,20,0,0">
<local:ControlView />
<local:CanvasView />
</StackPanel>
ControlView:
<StackPanel Orientation="Horizontal">
<Label Content="Length: " Margin="19,0,0,0"/>
<TextBox Margin="3" Width="130" Text="{Binding Path=Box.Length}"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<Button Margin="10" Content="Draw Canvas" Command="{Binding Path=DrawCanvasCmd}"/>
</StackPanel>
该按钮在ControlViewModel中触发一个名为DrawCanvas的方法。然后调用该方法,我希望根据输入绘制画布。画布的绘制在CanvasViewModel中完成。
任何人都可以看到如何做到这一点?我能够在CanvasViewModel的构造函数中使用静态值绘制画布,即So _I只需要将输入参数从控制面板发送到画布。
public void CanvasViewModel()
{
GeometryFigure.length = 120;
}
答案 0 :(得分:1)
如果您使用的是MVVM灯,则需要使用在GalaSoft.MvvmLight.Messaging中保存的Messenger。
基础教程:
在主窗口视图模型中,假设长度为整数
private void DrawCanvas()
{
Messenger.Default.Send(Length, "SOME KIND OF UNIQUE TOKEN");
}
CanvasViewModel的构造函数
public void CanvasViewModel()
{
Messegner.Default.Register<int>(this, "SOME KIND OF UNIQUE TOKEN", Draw);
}
CanvasViewModel中的其他地方创建了您在寄存器中调用的方法:
private void Draw(int length)
{
Do whatever you want to do with the length....
}
&#34;一些独特的令牌&#34;可以是任何东西,但要注意,如果您使用的东西太通用,那么您使用相同令牌注册的任何Messenger都将触发。我个人使用枚举器。此外,当您注册时,请确保它是您正在发送的正确类型。
这样做是关闭发送通知,包含已发送的值和令牌。如果注册任何内容以接收该类型的值,则使用该确切令牌,它将调用其注册的方法。这也非常适合测试,因为您可以在测试方法中注册以确保事件被触发并被接收,而不必涉及视图。
答案 1 :(得分:0)