我当然希望这个问题很容易回答,但已经过了几天,我还没想出如何在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>
答案 0 :(得分:1)
您使用的是任何MVVM框架吗?
这取决于,有不同的方法,多个视图访问一个视图模型是很常见的。
一,如果已经实例化
this.DataContext = ViewModelName(); (后端代码ofc中的datacontext绑定)
MVVM Light工具包将在ViewModel Locator中执行此操作,我相信
此外,您可以阅读此帖子的答案,在App.xaml.cs文件中制作静态视图模型 单身One ViewModel and multiple views
答案 1 :(得分:1)
根据我的理解,我会实现类似的东西 -
MainWindowViewModel -
MainWindow -
ComputerViewModel -
这种方法的好处 -
如果您有任何疑问或有什么不清楚,请告诉我。
答案 2 :(得分:0)
我认为你需要保持一致。如果您决定将处理每个View / UserControl中的数据的责任分配给不同的ViewModel,那么在将数据传递给外部实体时需要采用相同的方式。每个ViewModels负责传递数据。在这些控件之外设置按钮不是问题。有Mediator Pattern作为视图模型之间通信的最佳实践。这样,您就可以从按钮的viewmodel向每个控件中的ViewModel发送消息。收到来自按钮的消息后,您可以指示他们将数据传递给外部实体。
“viewmodels之间的通信wpf” 是在此处搜索问题的关键字。如果您使用MVVM Light,发送消息和订阅消息就像shown here一样简单。其他主要的MVVM框架,如Calliburn和Prism也有它。否则你可以搜索Mediator模式的简单实现(我想很多人已经实现了它,你可以使用他们的代码)。