1

我当然希望这个问题很容易回答,但已经好几天了,我还没有弄清楚如何在 UserControls 之间共享数据。

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

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

这是一个相当简单的程序,我真的认为不需要 3 个单独的 ViewModel,它们只包含单个元素,但也许这就是我需要做的。总而言之,当我点击那个开始按钮时,我仍然需要从所有东西中收集所有数据并将其提交给外部实体。

如果这是一个以前被问过的问题,我很抱歉,但我对 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>
4

3 回答 3

1

根据我的理解,我会像这样实现它 -

MainWindowViewModel -

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

主窗口 -

  • 负责创建标签的窗口。
  • 使用 MainWindowViewModel 中的 ComputerViewModel 集合动态创建选项卡(可以使用 DataTemplate 等)
  • 每个选项卡都将使用您拥有的 UserControl(开始按钮除外),UserControl 仍将拥有 ComputerViewModel,因为它是 DataContext。
  • 在 MainWindowViewModel 中有一个绑定到 StartTask 命令的开始按钮。

计算机视图模型 -

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

这种方法的好处 -

  • 标签创建将是动态的,并且会在您需要添加更多标签(计算机)时自动工作
  • 您可以轻松升级 MainWindowViewModel 以支持更多功能,例如删除/添加选项卡等。
  • 易于维护,因为您不需要处理选项卡之间的传递数据等。

如果您有任何问题或不清楚的地方,请告诉我。

于 2014-01-09T07:25:58.730 回答
1

你在使用任何 MVVM 框架吗?

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

一,如果已经实例化

this.DataContext = ViewModelName(); (后端代码中的数据上下文绑定)

MVVM Light 工具包将在 ViewModel Locator 中为您执行此操作,我相信是的

您还可以阅读此帖子的答案以在 App.xaml.cs 文件中制作静态视图模型单例一个视图模型和多个视图

于 2014-01-09T02:10:25.593 回答
0

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

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

于 2014-01-09T04:29:34.590 回答