如何将两个视图与两个视图模式绑定在一起我wpf?

时间:2013-11-03 14:22:27

标签: wpf mvvm view binding viewmodel

如何绑定/连接到具有自己的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;
}

2 个答案:

答案 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)

如果您使用PRISM框架,您可以使用EventAggregator,您可以使自己的EventAggregator基于Mediator Pattern。你可以在Here做同样的事情  和Here