Wpf 使用MVVM处理UIVM元素

Wpf 使用MVVM处理UIVM元素,wpf,mvvm,winrt-xaml,Wpf,Mvvm,Winrt Xaml,我正在构建一个应用程序,试图尽可能地追随MVVM。这是一个Windows8应用商店应用程序,Im使用MVVM light。现在假设我有一个使用MainViewModel的主页,还有一个使用UserViewModel的UserControl。 现在我希望能够在MainPage和UserControl之间进行通信,而无需使用任何代码。在这个简单的场景中,我想从MainPage中的按钮“单击”我的UserControl中的按钮 MainPage.Xaml: 这里有一个按钮,我想用它单击Usercont

我正在构建一个应用程序,试图尽可能地追随MVVM。这是一个Windows8应用商店应用程序,Im使用MVVM light。现在假设我有一个使用MainViewModel的主页,还有一个使用UserViewModel的UserControl。 现在我希望能够在MainPage和UserControl之间进行通信,而无需使用任何代码。在这个简单的场景中,我想从
MainPage中的按钮“单击”我的
UserControl
中的按钮

MainPage.Xaml: 这里有一个按钮,我想用它单击
Usercontroll

 <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Button Content="MyButton"
                Command="MyCommand"></Button>   


 </Grid>
Xaml 这是我希望在主页上单击的按钮

 <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
            <Button Content="UcButton"/>

     </Grid>
我很想知道如何按照MVVM模式与UI元素交互。任何链接或提示感谢

做到这一点的“干净”(MVVM方式)是让ViewModels交互

因此,如果View1应该调用View2中的某个内容,那么让View1在其ViewModel1上触发一个命令。然后,ViewModel1应联系ViewModel2。ViewModel2将执行所需的操作,并通过其属性显示结果。View2将绑定到属性并显示操作的效果


视图模型之间的交互可以通过MVVM中的发布者-订阅者模型(MessageBroker,bus,…)来完成,以保持依赖关系干净。

我不能评论,因为我没有足够的观点,这个问题似乎有点奇怪。是否要单击按钮以使其显示在GUI中,如按钮变为蓝色,还是要调用usercontrolViewModel中的命令。如果是后者,您可以执行如下修复:

MainPage.xaml

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Button Content="MyButton"
            Command="{Binding  UserControlViewModel.SomeUserControlCommand, Source={StaticResource Locator}}"></Button>
    </Grid>


记住在ViewModelLocator中检查您给UserControlViewModel起的名字,您当然需要在UserControlViewModel中创建命令:SomeUserControlCommand。

非常感谢,这很有意义。说得好。完全正确。我还将在这里讨论PubSubEvents方法的模式和实践:谢谢,这也会派上用场。我想为您提供一个关于消息传递的讨论,以防阅读此问题的人需要更多信息:
public class UserControlViewModel : ViewModelBase
        {
            //
        }
    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Button Content="MyButton"
            Command="{Binding  UserControlViewModel.SomeUserControlCommand, Source={StaticResource Locator}}"></Button>
    </Grid>