2010-03-02 65 views
14

我正在研究使用MVVM,雖然我大部分理解它,但有一件事我無法得到我的頭。MVVM將數據傳遞給對話框查看模型

想象一下,我有一個顯示foobar列表的View和ViewModel組合。當用戶在列表中選擇一個foobar並單擊編輯按鈕時,我想讓foobar顯示在一個彈出的對話窗口中,以便它可以被編輯。這個對話窗口(視圖)將有自己關聯的ViewModel。

我明白,該按鈕可以綁定到列表ViewModel上的命令,但從這裏我如何實例化foobar編輯器?

1)我是否必須將消息發送回視圖,這將打開對話窗口?如果是這樣,這是否違背了命令的目的?

2)foobar如何傳遞到編輯器的ViewModel?如果是通過它的構造函數,這是不是很難在XAML中聲明ViewModel?

我覺得這是阻止我使用MVVM的難題的最後一部分,我真的很想爲此獲得一個很好的解耦解決方案。

感謝 馬特

回答

2

我也許會做下列方式:

  1. 連接到編輯按鈕的命令開始編輯對話框,創建一個自定義視圖模型(VM)。命令本身應該可能在列表的虛擬機或模型中(不太確定)。
  2. Foobar編輯對話框的虛擬機在其構造函數中獲取對Foobar的引用。
  3. foobar被克隆,克隆被編輯。
  4. 只要用戶在foobar編輯對話框中按下確定,克隆的值就會被寫回VM中原始的foobar(並關閉對話框)。

對克隆的需求來自用戶不希望在foobar列表中看到更改,直到他接受編輯對話框中的更改。如果在線編輯沒問題,則不需要克隆。

更改會自動傳播。 PS:雖然我是MVVM的支持者,但我不確定我的解決方案是否是純粹的MVVM觀點的正統觀點。

1

This article from codeproject顯示了一個WPF對話框控件,它完全符合你的需求。這個實現的必要性的原因是你不能在任何其他控件的可視化樹中放置一個Window。這意味着開箱WPF不會讓你在窗口內創建一個對話框。所以上面的文章創建了一個創建窗口的子類ContentControl。

不管怎麼說,你把這個在您的FooBarList查看

<dialog:Dialog Content="{Binding Path=DialogViewModel}" /> 

你要確保你有一個資源字典是這樣的地方:

<Style TargetType="{x:Type dialog:Dialog}"> 
<Style.Triggers> 
    <Trigger Property="HasContent" Value="True"> 
    <Setter Property="Showing" Value="True" /> 
    </Trigger> 
</Style.Triggers> 
</Style> 

,只是寫這樣的事情(爲WPF你需要實現INotifyPropertyChanged):

public Class FooBarListViewModel 
{ 
    IList<FooBar> FooBarList {get;set;} 
    FooBar SelectedFooBar {get;set;} 
    ViewModelBase DialogViewModel {get;set;} 

    public EditFooBar(object param) 
    { 
    DialogViewModel = FooBar; 
    } 
} 

要連接Vie w至編輯FooBar的到FooBar的視圖模型只是做這樣的事情(最好是在Application.Resources所以它的全球)

<DataTemplate DataType={x:Type vm:FooBarViewModel}> 
    <vw:FooBarView/> 
</DataTemplate> 

(或可選:使用的IValueConverter來轉換從視圖模型like this post shows讓你查看)

然後你就定了。聽起來很多,但它真的讓你感覺很舒服。

+0

這是一個有趣的方法。看看這個示例項目,我想知道是否會因爲失去一個普通窗口的某些功能(調整大小,無模式等)而受到刺激。 我開始認爲這可能值得我考慮一個根本不需要複雜對話框的設計 - 而且可能有一個MDI應用程序。 你對此有何看法? – Matt 2010-03-03 21:00:37

0

缺少的是負責視圖模型工作流程的控制器。控制器創建ViewModels,並在ViewModels之間傳遞必要的數據。

WPF Application Framework (WAF)項目包含示例應用程序,顯示這可能如何工作。

相關問題