2012-03-03 87 views
0

我正在用MVVM模式在WPF/c#中寫一個表單,並試圖與用戶控件共享數據。 (嗯,用戶控制視圖模型)將數據傳遞給mvvm usercontrol

我要麼需要:

  1. 在該視圖模型創建父母視圖模型,並將其綁定到用戶控件
  2. 綁定某些類Xaml
  3. 被告知用戶控件無法與MVVM一起使用並被推向正確的方向。 (我看過數據模板但看起來並不理想)

usercontrol僅用於使大型表單更容易管理,所以我不確定這是否與MVVM一起使用,它是我過去如何做到這一點。

我想通過一個類的VM構造在Xaml。

<TabItem Header="Applicants"> 
    <Views:ApplicantTabView> 
     <UserControl.DataContext> 
      <ViewModels:ApplicantTabViewModel Client="{Binding Client} /> 
     </UserControl.DataContext> 
    </Views:ApplicantTabView> 
</TabItem> 
public ClientComp Client 
    { 
     get { return (ClientComp)GetValue(ClientProperty); } 
     set { SetValue(ClientProperty, value); } 
    } 

public static readonly DependencyProperty ClientProperty = DependencyProperty.Register("Client", typeof(ClientComp), 
                      typeof(ApplicantTabViewModel), 
                         new FrameworkPropertyMetadata 
                          (null)); 

但我似乎無法獲得扶養屬性接受非靜態內容。

這對我來說一直是個問題,但假設我會發現但失敗了,所以我在這裏。

由於提前, 奧利

+0

虛擬機通常不應該是依賴項對象 – 2012-03-03 18:49:24

+0

我不希望虛擬機是一個DP我只是想能夠與UserControl的虛擬機共享一些父類。如果我嘗試並正常綁定,則會出現它需要成爲DP的錯誤。 – Oli 2012-03-03 20:10:07

+0

是的,你通常不會綁定虛擬機(在那個方向) – 2012-03-03 20:10:47

回答

2

我最近回答了類似的問題,因爲你的:passing a gridview selected item value to a different ViewModel of different Usercontrol

本質上建立一個依賴屬性它允許來自父視圖的數據持續到您的子級用戶控件。將您的視圖抽象爲特定的用戶控件並使用依賴屬性和MVVM模式進行鉤連實際上是非常強大的,並且推薦用於Silverlight/WPF開發,特別是在單元測試開始時。讓我知道如果你想要更多的澄清,希望這有助於。

+0

這是一個很好的幫助,但我想我錯過了一些關於依賴屬性的非常基礎的東西。我可以將一個非常簡單的項目發送給你嗎?確實不勝感激。 (如果您不介意,請發送郵件到我的Gmail) – Oli 2012-03-05 13:57:22

+0

關於依賴屬性,您有什麼問題? – KodeKreachor 2012-03-05 23:54:00

+0

我很困難地在父母和孩子之間進行綁定(通過視圖上的DP)進行「雙向」綁定。我用一個Window(Plus VM)/ 1個用戶控制(Plus VM)/ 1簡單實體做了一個小項目,並試圖共享這兩者之間的實體。現在我已經有了一個實際的項目,但是我認爲它遠沒有達到行業標準。謝謝你的時間。奧利 – Oli 2012-03-07 13:50:43

4

奧利 - 這是確定(實際 - 推薦)查看的部分分成用戶控件,如果UI變得太大 - 獨立可以拆分視圖模型副視點模型,如果虛擬機變得太大。

它似乎雖然你正在做你的子虛擬機的雙實例化。也不需要在虛擬機中創建依賴屬性(實際上,我認爲它是錯誤的)。

在你的外部VM中,只需要ClientComp是一個常規屬性。如果你不打算改變它 - 設定者甚至不必發射屬性改變的事件,儘管它是推薦的。

public class OuterVm 
{ 
    public ClientComp Client { get; private set; } 

    // instantiate ClientComp in constructor: 
    public OuterVm() { 
     Client = new ClientComp(); 
    } 
} 

然後,在XAML,把ApplicantTabView,並結合其數據方面:

... 
<TabItem Header="Applicants"> 
    <Views:ApplicantTabView DataContext="{Binding Client}" /> 
</TabItem>