2010-11-09 77 views
2

我是MVVM的新手,我試圖按照模式實現一個簡單的應用程序。從中央數據源在MVVM中創建tabcontrol

爲了簡單起見,我將問題分解爲最簡單的形式。如果我設法使這個工作成功,我將無法獲得應用程序。

簡單的應用程序由tabcontrol組成。這兩個選項卡都有自己的ViewModel是非常重要的。但是,他們將從同一個來源獲取大部分數據。主要問題是讓第二個標籤知道第一個標籤已經啓動了對數據源的更改。

所以,爲了簡單起見,我們只是說該模型只包含一個整數。此整數最初需要設置爲1.

第一個選項卡包含文本塊和按鈕。文本塊的文本綁定到數據模型中的整數。按下該按鈕後,moddel中的整數應該加1。

第二個選項卡只包含一個文本塊,它也綁定到數據模型中的整數。挑戰是讓這個文本塊與第一個文本塊一起更新,但仍然是它自己的視圖模型。

我需要某個地方存儲模型的值,並以某種方式讓視圖模型知道它們已經更新,所以它們的屬性可以更新,因此視圖因此得到相應更新。

有人可以儘可能詳細地解釋如何做到這一點嗎?我嘗試了十億種不同的方式,但我沒有得到它的工作。

回答

1

讓我看看,如果我有你的問題降權:

  • 您有一個數據源(模型)。
  • 您有2種觀看模型。
  • 查看模型1更改模型中的數據。
  • 查看模型2需要更新模型中的更改。

如果這一切聽起來不錯,這裏有一個解決方案:

有你的模型執行INotifyPropertyChanged。當整數更改時,引發PropertyChanged事件。在模型2中,偵聽模型的PropertyChanged事件。發生時,引發視圖模型2的屬性更改事件,其UI將自動更新。

+0

感謝您的答覆。你的問題是對的,這聽起來像一個有趣的方法 - 今晚我會先試一試。如果它解決了我的問題,我將返回信息:) – Sagi1981 2010-11-10 06:24:59

+0

還有另一種使用信使/中介模式的方法。但這似乎是*正確*方法。 – 2010-11-10 15:09:27

+0

謝謝 - 我現在已經開始工作了。感謝所有貢獻者。 – Sagi1981 2010-11-18 15:20:24

0

我不知道你想在哪種情況下做到這一點。 但是,一個解決方案是我的頭腦中有一個「父」ViewModel,它擁有兩個選項卡ViewModels的實例。

例如

public class ParentViewModel{ 

    private Tab1ViewModel viewModel1; 
    private Tab2ViewModel viewModel2; 
} 

然後ParentViewModel可以訂閱ViewModel1的INotifyPropertyChanged的事件,並在ViewModel2值。

+0

感謝您的迅速回答:)場景是我有一個數據存儲集合,我的不同標籤顯示不同的東西,這些都是通過它們各自的視圖模型計算出來以呈現在某種方式。麪包和黃油是改變標籤X上的東西,會影響數據的收集,因此所有的標籤應該自動更新其屬性。但我甚至無法讓第二個選項卡對我給出的簡化示例做出反應。我會試着看看你的建議,但如果我的澄清給了你一個新的想法,我很樂意再次收到你的來信:) – Sagi1981 2010-11-09 21:02:29

+0

閱讀我的評論,我不太清楚。所有選項卡的數據收集是相同的,但它們都根據各種視圖模型上實施的各種方法不同地顯示它們。 C選項卡上的命令1可能會更改某些數據,這意味着所有其他選項卡應該更新:) – Sagi1981 2010-11-09 21:05:14

0

我最近實現了一些類似的東西。這是實現一個嚮導,其中包括:

  • 7次
  • 8查看模型
  • 1型號

主要視圖模型創建的模型,並通過這對所有其他視圖模型通過它們的構造函數。

在您的場景中,您可以使用ViewModel的ObservableCollection創建主ViewModel。這些VM中的每一個都將具有與其數據源相同的模型實例。

如前所述,在模型上實現INotifyPropertyChanged,並通過ViewModel上的屬性直接將視圖綁定到模型。我發現這個圖非常有用:http://karlshifflett.files.wordpress.com/2009/01/wpflobmvvm1.png