【问题标题】:How to create and show views on command request?如何根据命令请求创建和显示视图?
【发布时间】:2010-06-13 07:42:13
【问题描述】:

我已经开始使用 mvvm-light 工具包,并且是 WPF 的新手。

我的问题是: 我想创建一个应用程序,其中主窗口包含一个带有 2 列 1 col 命令的网格,并且 col2 将在按下每个命令时显示视图。 我希望根据命令创建视图,并从它自己的视图中获取视图。

我试图弄清楚如何做到这一点,但没有成功。

我不知道如何使用 mvvm light 编写这种功能。

我只知道如何使用主视图创建主窗口,而另一个视图已在加载时创建。

请帮帮我..

我使用的是 2008 WPF3.5

雪莉。 今天让我开心..我刚刚开始这一周!!!

谢谢。我已经完成了它并得到了当前 ViewModel "LU.ViewModel.AllChannelsViewModel" 的 Tostring() 而不是真实视图。

我要加载的视图是: 我正在使用 mvvm-light

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="30" />
        <RowDefinition Height="30" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <Button Grid.Row="0" Height="22" HorizontalAlignment="Right" Margin="8,4,0,0" Name="closebutton" VerticalAlignment="Top" Width="100" Command="{Binding CloseCommand}">Close</Button>
    <Button Grid.Row="1" Height="22" HorizontalAlignment="Left" Margin="8,4,0,0" Name="button1" VerticalAlignment="Top" Width="100" Command="{Binding GetChannelsCommand}">Load Channels</Button>
    <Button Grid.Row="1" Height="22" HorizontalAlignment="Right" Margin="8,4,0,0" Name="button2" VerticalAlignment="Top" Width="100" Command="{Binding NewChannelCommand}">New Channel</Button>
    <dg:DataGrid   Grid.Row="2"  ItemsSource="{Binding AllChannelsData}" Margin="0,30,0,0" />


</Grid>

我在这里想念什么?如何显示我想要的真实视图而不是视图模型的名称?

雪莉

【问题讨论】:

    标签: wpf mvvm-light


    【解决方案1】:

    我不知道 MVVM Light 是否有任何特定的功能,但在 MVVM 中创建视图的常用方法是创建一个绑定到 ViewModel 属性的ContentControl。当您将新 ViewModel 影响到该属性时,ContentControl 使用与 ViewModel 类型匹配的 DataTemplate 呈现它:

    <!-- In resources -->
    <DataTemplate DataType="{x:Type vm:FooViewModel}">
        <v:FooView />
    </DataTemplate>
    
    <DataTemplate DataType="{x:Type vm:BarViewModel}">
        <v:BarView />
    </DataTemplate>
    ...
    
    <!-- In the main view -->
    
    <ContentControl Content="{Binding Current}" />
    

    【讨论】:

    • 我认为这个人的意思是创建一个可以通过命令打开的视图。
    • @Brian,你认为,但你不知道,而且 OP 从来没有回来证明你是对还是错,所以我不认为它值得一票否决...
    • 托马斯,感谢您的回复。当我使用这个词时,认为这是礼貌而不是什么都知道。他们写的文字特别指出:“......在按下每个命令时显示视图。我希望​​根据命令创建视图......”这表明他们想要点击一个绑定到的按钮打开视图的命令。同样,他们的 xaml 包含两个按钮,这表明他们了解如何创建视图。所以,我支持我的反对票。如果冒犯了你,我很抱歉。
    • @Brian,我没有被冒犯,我只是认为这个答案不值得......我的答案在这种情况下仍然有效:例如,如果 ContentControl 绑定到一个属性,命令可以更改该属性,这将在 ContentControl 中显示不同的视图。我一直使用这种方法...
    【解决方案2】:

    请原谅我为您提供了一个 MVVM Light 工具包中没有的选项,但我已经走在您的道路上并出于这个原因选择使用 Prism。我没有时间详细介绍 Prism 或事件聚合器,但在那个工具中你会:

    1. 在您的视图模型中创建一个 ICommand,您可以将按钮或事件绑定到该命令
    2. 您执行的命令将使用方法发布调用事件聚合器。这是您已经在 VM 之外设置的事件,正在等待调用。调用时,该事件会显示您的表单。您甚至可以将属性甚至其他 VM 传递给事件。这使您的虚拟机不知道该视图。

    最后,MVVM 对我来说非常棒,但它会给你带来很多这样的挑战。不要指望在一天之内征服它或快速创建应用程序,但是当你把一切都安排妥当时,这是一个很好的范例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-27
      • 1970-01-01
      • 2011-03-16
      • 2016-09-21
      • 1970-01-01
      相关资源
      最近更新 更多