2011-04-30 112 views
3

我需要一些幫助。我有一個Silverlight應用程序父窗體有一個搜索按鈕,當點擊加載一個ModalDialog有3個文本框,兩個按鈕(用於搜索和重置)和一個DataGrid(telerik gridview,但我可以將它更改爲任何網格,所以不是問題)。我在其中一個按鈕上輸入搜索條件,說出姓氏,並將具有該特定姓氏的所有記錄加載到網格上。我需要能夠在網格上選擇一行,並且這樣做,所選行的細節應該在父窗口上的控件上更新(父窗口上沒有網格,就像數據輸入窗體一樣)。我正在使用MVVM。我如何在保持真正MVVM模式的同時實現這一目標?我剛剛看到很多關於將數據從父代傳遞到子代的問題,沒有將子代傳遞給父代/調用窗口。Silverlight 4 MVVM DataGrid和子窗口將數據傳遞迴父窗口

任何幫助,和一些簡單的代碼示例中,將不勝感激。已經在它上面整整三天了,而且還沒有弄明白。

弗朗西斯。

回答

1

我在MVVM光工具包使用通訊做到了這一點。它使用一種叫「PubSub的」,這意味着「發佈消息,訂閱消息」我在模態窗口的GridView控件使用命令

。以下是適用於此的XAML:

<i:Interaction.Triggers> 
    <i:EventTrigger EventName="SelectionChanged"> 
     <cmd:EventToCommand Command={Binding ItemSelectedCommand} /> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 

根據您使用的MVVM工具包的風格(如果有),語法可能不同。正如我所說的,就我而言,MVVM燈。最終,我使用iCommand界面將此命令傳遞給我的視圖模型。在我的情況下,CMD參考指向Galasoft.MvvmLight.Command:

xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;Assembly=GalaSoft.MvvmLight.Extras.SL4" 

在視圖模型爲我的孩子的窗口,我註冊了命令,當它的觸發,我把這行:

Messenger.Default.Send<TSMVVM.Model.WorkOrders>(SelectedWorkOrder); 

此行通過SelectedWorkOrder發佈(發送)WorkOrders類型的消息(這是模型類在我的應用程序中)。這行代碼位於命令的內部,該命令在GridView的SelectionChanged事件中觸發。在這個例子中的代碼是:

_ItemSelectedCommand = new RelayCommand(WorkOrderSelected); 

private void WorkOrderSelected() 
{ 
    Messenger.Default.Send<TSMVVM.Model.WorkOrders>(SelectedWorkOrder); 
} 

以我父窗口,在構造函數中,我有這樣的:

Messenger.Default.Register<TSMVVM.Model.WorkOrders>(this, SetWorkOrder); 

此行寄存器(或定製)類型工作訂單的消息。通過我的應用程序發送消息的任何時間,類型工單的,它調用一個函數:SetWorkOrder,低於:

private void SetWorkOrder(TSMVVM.Model.WorkOrders wo) 
    { 
     this.SelectedWO = wo; 
    } 

我的DataForm已綁定工作訂單的的ItemsSource,註定SelectedWO一個CURRENTITEM,設置雙向綁定。因此,當我更新SelectedWO(通過Mvvm light toolkit的viewmodelbase實現INotifyPropertyChanged)時,DataForm會相應更新。

如果您需要更多的信息,讓我知道!

斯科特