如何绑定(bind)/连接到不同的 View ,它们有自己的 View 模型?
我有一个包含用户控件/ View 的 mainWindow。它们中的每一个都有自己的 viewModel。第一个 View 就像一个控制面板,带有一个用于向应用程序输入输入参数的表单。另一种是 Canvas ,根据控制面板上的输入参数显示分析结果。
例子:
主窗口:
<StackPanel Orientation="Horizontal" Margin="0,20,0,0">
<local:ControlView />
<local:CanvasView />
</StackPanel>
控制 View :
<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 的方法。然后调用该方法,我希望根据输入绘制 Canvas 。 Canvas 的绘制在 CanvasViewModel 中完成。
谁能看到如何做到这一点?我可以使用 CanvasViewModel 构造函数中的静态值来绘制 Canvas ,即,我只需要将输入参数从控制面板发送到 Canvas 即可。
public void CanvasViewModel()
{
GeometryFigure.length = 120;
}
最佳答案
如果您使用的是 MVVM 灯,则要使用 GalaSoft.MvvmLight.Messaging 中的 Messenger。
基础教程:
在主窗口 View 模型中假设长度是一个整数
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....
}
“某种独特的 token ”可以是任何东西,但请注意,如果您使用过于通用的东西,您使用相同 token 注册的任何 Messenger 都会触发。我个人使用枚举器。此外,当您注册时,请确保它是您发送的正确类型。
这样做是发送一个通知,其中包含已发送的值和 token 。如果有任何东西被注册以接收该类型的值,使用那个确切的 token ,它将调用它注册的方法。这也非常适合测试,因为您可以在测试方法中注册以确保事件被触发并被接收,而无需涉及 View 。
关于wpf - 如何将两个 View 与两个 viemodel 绑定(bind)在一起我 wpf?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19753970/