2010-08-26 31 views
2

我是wpf和MVVM的全新品牌。我有一個主窗口,有兩個視圖左側有一個帶有一個列表框的用戶控件,列表框中有一個編輯按鈕。在右側,我有另一個視圖,其中包含我所有用於查看和編輯記錄的控件。我可以在列表框中選擇一個項目並編輯我的記錄,因爲使用綁定它會自動填充selectedItem對象。我想要做的是當用戶點擊編輯按鈕時顯示右側的視圖,如果他們點擊列表框中包含的另一個按鈕,然後顯示右側的視圖並關閉前一個視圖。我想我在這裏錯過了一個大概念,因爲大多數例子都是簡單化的,只是表現出一種觀點。我真的不想在後面的代碼中做這件事。我看過約翰史密斯標籤,並希望做一些相似的事情,但沒有標籤。任何幫助將不勝感激。使用MVVM顯示視圖的正確方法

回答

0

這聽起來像兩個視圖需要共享相同的情況下(即視圖模型),那麼他們將留在由依賴屬性的魔法同步automaticall ...

+0

其實第二個視圖將是一個不同的數據上下文我有關於第二個視圖上的一個視圖和卡信息的員工信息。僱員可以擁有一個或多個與之相關的卡片。所以我想通過在列表框中選擇的按鈕調出編輯員工視圖,然後如果他們選擇列表框記錄上的卡片按鈕,我想調出卡片視圖。我可以在後面的代碼中做到這一點,但是想要遵循我迄今爲止所做的MVVM模式,但是由於我不知道如何告訴主窗口需要顯示特定視圖,所以沒有面對代碼。 – spafa9 2010-08-26 14:20:28

+0

想我終於連接了所有的點。我使用喬希史密斯的例子作爲指導。我已經把它放在了現在的視圖中,只需要在編輯另一條記錄時關閉它。 – spafa9 2010-08-26 18:17:23

0

我可能會嘗試設置它,這樣既點擊按鈕(查看或編輯)設置右邊框的DataContext。使用基於DataContext的DataTemplates顯示RightFrame視圖。

所以,你的XAML會是這樣的:

<DataTemplate DataType={x:Type MyEditingViewModel}> 
    <!-- Editing Object View --> 
</DataTemplate> 

<DataTemplate DataType={x:Type MyViewingViewModel}> 
    <!-- Viewing Object View --> 
</DataTemplate> 

和你的按鈕點擊事件是這樣的:

private void EditButton_Click(object sender, EventArgs e) 
{ 
    RightFrame.DataContext = new MyEditingViewModel((sender as Button).DataContext) 
} 

private void ViewButton_Click(object sender, EventArgs e) 
{ 
    RightFrame.DataContext = new MyViewingViewModel((sender as Button).DataContext) 
} 
0

因此,基本上,你想要做的是有您的視圖模型將決定應該呈現哪個視圖,並根據用戶選擇做出該決定。

我是怎樣做到這樣的事情:

我的視圖模型公開一個視圖樣式屬性,這是一個枚舉。在視圖模型(通常是用戶控件)的視圖中,我實現了DockPanel以包含每種視圖風格。每個DockPanel被分配了一個樣式和風格的定義是這樣的:

<Style x:Key="Style_View1" TargetType="DockPanel"> 
    <Setter Property="Visibility" Value="Collapsed"/> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding ViewStyle}" Value="View1"> 
      <Setter Property="Visibility" Value="Visible"/> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

<Style x:Key="Style_View2" TargetType="DockPanel"> 
    <Setter Property="Visibility" Value="Collapsed"/> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding ViewStyle}" Value="View2"> 
      <Setter Property="Visibility" Value="Visible"/> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

(很明顯,你不需要使用DockPanel如果GridStackPanel是更適合您的方案,並可以實現。不同的用戶控制每種風格的視圖,如果你想保持你的代碼很好地分割。)

所以只要ViewStyle的值是有一個相應的樣式,那個視圖樣式將是可見的。由於所有樣式默認設置VisibilityCollapsed,所以最多隻能有一個可見的視圖樣式。

有很多方法可以選擇視圖樣式 - 爲每個視圖樣式創建一個命令並將其綁定到按鈕,創建一組單選按鈕並使用值轉換器,設置視圖樣式以響應其他屬性視圖模型 - 無論什麼作品。

相關問題