2014-01-09 57 views
1

我当然希望这个问题很容易回答,但这已经过去了几天,我还没有想出如何在UserControl之间共享数据。在多个视图中共享ViewModel

下面的页面有两个选项卡,并且它们的源被引用。它还有一个标签为Start的按钮,用于访问ViewModel中的命令。

我遇到的问题是数据实际上在选项卡内。我将它们设置为使用相同的ViewModel,并且它们都创建了自己的ViewModel实例,因此数据永远不会显示到“开始”按钮。我希望从那以后。

这是一个相当简单的程序,我真的没有看到需要有3个独立的ViewModels只包含单个元素,但也许这就是我需要做的。总而言之,我仍然需要收集所有数据,并在按下该开始按钮时将其提交给外部实体。

我很抱歉,如果这是一个问题之前已经问过,但我相对较新的C#所以我不完全确定我在问什么。提前致谢!

<UserControl 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:mui="http://firstfloorsoftware.com/ModernUI" 
      x:Class="DeployWiz.Pages.Config" 
      mc:Ignorable="d" 
      xmlns:local="clr-namespace:DeployWiz.ViewModel" 
      d:DesignHeight="356.978" d:DesignWidth="333.582"> 
    <Grid Style="{StaticResource ContentRoot}" Margin="16,28,16,5" > 
     <Grid.DataContext> 
      <local:ComputerViewModel/> 
     </Grid.DataContext> 
     <mui:ModernTab x:Name="tabList" Layout="List" SelectedSource="/Views/ComputerView.xaml" Margin="0,0,0,40"> 
      <mui:ModernTab.Links> 
       <mui:Link DisplayName="Settings" Source="/Views/ComputerView.xaml" /> 
       <mui:Link DisplayName="Applications" Source="/Views/ApplicationView.xaml" /> 
      </mui:ModernTab.Links> 
     </mui:ModernTab> 
     <Button Content="Start" HorizontalAlignment="Center" Margin="0,0,0,5" VerticalAlignment="Bottom" Width="75" Command="{Binding Path=StartTask}"/> 
    </Grid> 
</UserControl> 

回答

1

是否使用任何MVVM框架?

这取决于,有不同的方法,通常多个视图访问一个视图模型。

之一,如果已经实例化的

this.DataContext = ViewModelName(); (的datacontext在后端代码OFC结合)

MVVM光工具包将视图模型定位器内做到这一点的U,我相信这样

而且u能读这个帖子回答,使静态的ViewModels在App.xaml中.cs文件 singleton One ViewModel and multiple views

0

我认为你需要保持一致。如果您决定将处理每个View/UserControl中的数据的责任分配给不同的ViewModel,那么在将数据传递给外部实体时需要应用相同的方法。每个ViewModels负责传递数据。在这些控制之外有一个按钮不是问题。作为在视图模型之间进行通信的最佳实践,有Mediator Pattern。这样你就可以在按钮的viewmodel的每个控件中发送消息给ViewModels。在收到来自按钮的消息后,您可以指示他们将数据传递给外部实体。

“WPF的ViewModels之间的通信”为关键词在这里搜索您的问题。如果您使用MVVM Light,发送消息和订阅消息就像shown here一样简单。其他主要的MVVM框架如Calliburn和Prism也有它。否则,您可以搜索Mediator模式的简单实现(我猜很多人已经实现了它,您可以使用它们的代码)。

1

按我的理解,我会实现它是这样的 -

MainWindowViewModel -

  • 有ComputerViewModel的可观察到的集合。
  • 有一个StartTask命令,它将使用集合中的项目来提交更改等,即将具有所有选项卡的数据。

主窗口 -

  • 窗口,负责创建标签。
  • 创建标签动态地使用MainWindowViewModel ComputerViewModel的集合(可以使用的DataTemplate等)
  • 每个标签都将使用用户控件你有(除开始按钮),用户控件将STIL有ComputerViewModel,因为它的DataContext的。
  • 将Start按钮绑定到MainWindowViewModel中的StartTask命令。

ComputerViewModel -

  • 不需要StartTask命令(除非它应该执行一些ComputerViewModel特定的任务,在这种情况下,它应该被重新命名为适当的东西)

优势这种方法 -

  • 制表符创建将是动态的,将自动工作在cas è您需要添加更多的标签(计算机)
  • 您可以轻松地升级MainWindowViewModel支持更多的功能,例如删除/添加标签等
  • 易于维护,你不需要处理标签等
  • 之间传递数据

让我知道如果您有任何问题或不清楚的东西。

相关问题