2014-01-09 85 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支持更多的功能,例如刪除/添加標籤等
  • 易於維護,你不需要處理標籤等
  • 之間傳遞數據

讓我知道如果您有任何問題或不清楚的東西。

相關問題