1

如何绑定/连接到不同的视图,它们有自己的视图模型?

我有一个包含用户控件/视图的 mainWindow。它们中的每一个都有自己的 viewModel。第一个视图就像一个控制面板,带有一个用于向应用程序输入输入参数的表单。另一种是画布,根据控制面板上的输入参数显示分析结果。

例子:

主窗口:

    <StackPanel Orientation="Horizontal" Margin="0,20,0,0">
        <local:ControlView />
        <local:CanvasView />
    </StackPanel>

控制视图:

        <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 构造函数中的静态值来绘制画布,即,我只需要将输入参数从控制面板发送到画布即可。

public void CanvasViewModel()
{
     GeometryFigure.length = 120;
}
4

2 回答 2

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....
}

“某种独特的令牌”可以是任何东西,但请注意,如果您使用过于通用的东西,您使用相同令牌注册的任何 Messenger 都会触发。我个人使用枚举器。此外,当您注册时,请确保它是您发送的正确类型。

这样做是发送一个通知,其中包含已发送的值和令牌。如果有任何东西被注册以接收该类型的值,使用该确切的令牌,它将调用它注册的方法。这也非常适合测试,因为您可以在测试方法中注册以确保事件被触发并被接收,而无需涉及视图。

于 2013-11-03T18:24:43.687 回答
0

如果您使用 PRISM 框架,您可以使用 EventAggregator,您可以创建自己的基于 Mediator Pattern 的 EventAggregator。你可以在这里这里也一样

于 2013-11-03T14:33:30.217 回答