2010-02-10 72 views
4

我正在WPF項目中工作,我正在項目中使用MVVM模式。我創建了一個用戶控件(同樣在WPF中),我想在我的項目中使用它,現在,我的問題是我的用戶控件中有一個方法需要從我的視圖模型中調用,但是我不知道該怎麼做,如何從視圖模型綁定到我的控制內的方法。如何使用MVVM調用用戶控件方法?

如果我使用後面的代碼,顯然沒有問題,因爲我直接引用了我的控件,所以我可以執行「mycontrol.MyMethod();」m,但當然,這樣做會違規MVVM模式的邏輯。

我試圖在我的用戶控件中使用依賴屬性,並使用該依賴屬性綁定到它在我的項目的xaml但它沒有奏效,編譯器說該屬性未找到或不是序列化。

因此,我將不勝感激,如果有人可以分享我如何才能做到這一點一些輕。

編輯

據我理解你的觀點,這是所有的GUI,那麼你的模型,它是所有的邏輯,和他們,你有視圖模型這就好比用於將視圖與模型綁定的中間層,對吧?

以這種方式我開發了我的項目,但是我遇到了需要自定義控件,記住用戶輸入內容的TextBox以及何時開始輸入的文本框,如果有以該字母開頭的單詞,那些話就像谷歌這樣做,就是一個建議。

該文本框用作搜索過濾器;所以我創建了一個用戶控件來執行此操作,我向用戶控件添加了一個方法,以允許使用我的控件的任何應用程序將項添加到包含用戶輸入的所有字符串的內部數組。

我創建了一個用戶的控制,因爲我找不到,其行爲就是我想要的任何控制。

所以我的問題是當我將用戶控件添加到主項目時,因爲我需要某些方面能夠調用將項目添加到內部數組的方法,但也許我做錯了方式,所以如果你們中的任何一個人有更好的主意,我會很感激,如果你與我分享。

回答

0

爲什麼用戶控件的消費者需要保持控制的內部陣列?這似乎是你已經暴露了一個你不需要的實現細節。

爲什麼就不能作出這樣的陣列依賴項屬性(和IEnumerable<string>ObservableCollection<string>之外)?然後,您可以簡單地在視圖模型中創建相應的屬性並將其綁定到控件。它也使控制功能更加通用。

+0

是的,你是完全正確的,那樣就更容易了,但是,我按照你的建議來嘗試它,但是當我在視圖模型的相應屬性中添加或刪除項目時,我的用戶控件中的依賴項屬性從未更新。 – Vic 2010-02-10 21:08:27

+0

@Vic:這聽起來像是一個INotifyPropertyChanged問題或類似的東西。這是基本的綁定通知的東西。羅伯特的建議應該可行......你只需要在綁定上挖一點點。本文將幫助您調試綁定:http://bea.stollnitz.com/blog/?p=52 – 2010-02-10 22:37:58

+0

我發現了兩種解決此問題的方法,第一種方法是將我的目標屬性設置爲依賴屬性,因此View-Model類必須從DependencyObject繼承。另一種方法是將我的目標屬性作爲公共屬性,但在集合{}中,您必須添加「base.RaisePropertyChanged(」your_property_name「);」並且View-Model類將不得不從ObservableObject繼承。非常感謝,因爲沒有你的意見,我不會做到。 – Vic 2010-02-11 16:51:20

0

因爲這打破了模型,您不應該調用在查看一些從視圖模型。

如果你想在用戶控件中調用方法的原因僅僅是用戶界面,我從視圖中看不出有什麼問題 - 視圖的cs和視圖的xaml處於相同的「空間「。你可能過於純粹主義,希望擁有精益和意味着查看CS文件。

+0

嗯,我說我想從ViewModel中調用方法,因爲它最接近視圖,但是你是對的,遵循模型邏輯,我應該從模型中調用方法,但是問題仍然存在,你如何從模型中調用用戶控件中的方法?我需要在用戶控件中使用添加項目到內部數組... – Vic 2010-02-10 15:55:41

+0

@Vic我覺得你用Amaca的建議去了另一種方式。當Amaca說「模型」時,他/她說* MVVM模式*。你永遠不應該*需要直接引用模型中的視圖。也許你可以編輯你的答案,提供更多關於你的場景的細節,並且有人可能會向你推薦一些東西。當你不必(創建一個實際的控件應該很少)時,你很可能創建了一個控件,我們可以幫你解決這個問題 – 2010-02-10 17:42:48

+0

謝謝,我在我的問題中添加了更多信息,希望這有助於。 – Vic 2010-02-10 18:06:03

1

你不應該從ViewModel調用View方法,反之亦然。

在您的ViewModel上創建一個屬性(ObservableCollection?),它將有CollectionChanged事件,訂閱它來監視更改(如果需要)。

將項目添加到ViewModel中的集合時,GUI將相應地更新(您必須在GUI線程上執行Add()操作,btw)。

如果您需要更改列表中的當前位置,則會存在相應的選擇(CollectionViewSource等)。

如果您確實需要將字符串傳遞給您的控件,請創建一個DependencyProperty並將其綁定到您的ViewModel的屬性。當你設置這個值時,它會在你的DependencyProperty上調用PropertyChangedCallback。