2010-05-21 78 views
3

我有主具體實現一個DataGrid如下:將數據傳遞給子窗口Silverlight 4中使用MVVM

<data:DataGrid x:Name="dgData" Width="600" ItemsSource="{Binding Path=ItemCollection}" 
         HorizontalScrollBarVisibility="Hidden" CanUserSortColumns="False" RowDetailsVisibilityChanged="dgData_RowDetailsVisibilityChanged"> 
        <data:DataGrid.Columns> 
         <data:DataGridTextColumn Header="Item" Width="*" Binding="{Binding Item,Mode=TwoWay}"/> 
         <data:DataGridTextColumn Header="Company" Width="*" Binding="{Binding Company,Mode=TwoWay}"/> 

        </data:DataGrid.Columns> 
        <data:DataGrid.RowDetailsTemplate> 
         <DataTemplate> 
          <data:DataGrid x:Name="dgrdRowDetail" Width="400" AutoGenerateColumns="False" HorizontalAlignment="Center" 
             HorizontalScrollBarVisibility="Hidden" Grid.Row="1"> 
           <data:DataGrid.Columns> 
            <data:DataGridTextColumn Header="Date" Width="*" Binding="{Binding Date,Mode=TwoWay}"/> 
            <data:DataGridTextColumn Header="Price" Width="*" Binding="{Binding Price, Mode=TwoWay}"/> 
            <data:DataGridTemplateColumn> 
             <data:DataGridTemplateColumn.CellTemplate> 
              <DataTemplate> 
               <Button Content="Show More Details" Click="buttonShowDetail_Click"></Button> 
              </DataTemplate> 
             </data:DataGridTemplateColumn.CellTemplate> 
            </data:DataGridTemplateColumn> 
           </data:DataGrid.Columns> 
          </data:DataGrid> 
         </DataTemplate> 
        </data:DataGrid.RowDetailsTemplate> 
       </data:DataGrid> 

我想在點擊其中顯示有關該產品的更多詳細信息按鈕打開一個子窗口。

我正在使用MVVM模式。我的模型包含一個方法,它將項目名稱作爲輸入並退回細節數據。

我的問題是,我應該如何將Item傳遞給ViewModel,它將從Model獲取Details數據?在哪裏我打開新的兒童窗口?在View或ViewModel中?

請幫忙。謝謝。

回答

5

從視圖模型中打開子窗口違反了模式應該是全部關於視圖和視圖模型之間的分離。因此,您可能沒有太多的選擇來打開子窗口的位置 - 網格所在頁面的代碼。 (這也違反了模式,但是,除了一個複雜的解決方案之外,它就是你所能做的所有事情。)我使用MVVM模式,但我對此沒有「宗教信仰」。當效率決定時,我會違反一些模式的規則。

只要將項目傳遞給ViewModel - 我想你可以在ViewModel上創建一個代表項目ID的屬性。我一直使用子窗口作爲數據輸入表單進行更新和添加。我傾向於爲它們中的每一個創建一個ViewModel。在你的情況下,你將有一個代表該項目細節的ViewModel。會有某種與物品和細節相關的ID。這將是ViewModel上的公共財產。您可以爲將該ID用作參數的子窗口創建構造函數。然後,子窗口構造函數可以創建ViewModel並將其發送給ID。

就像這樣 - 其中DomainEdit是子窗口的名稱。

public DomainEdit() 
    { 
     InitializeComponent(); 

     devm = new DomainEditVM(); 
     DataContext = devm; 
    } 

    public DomainEdit(Guid domainId) : this() 
    { 
     devm.DomainId = domainId; 
     devm.GetDomain(); 
     txtTitle.Text = "Edit Domain"; 
    } 

然後,在按鈕點擊電網發生後面的代碼,您創建一個新的構造函數的子窗口,傳遞您從項目的網格行中綁定的將ID,並提供獨立意見子窗口模型接管。

至少,這是一直在爲我工作。

+0

你真的需要使用Guid作爲實體的Id嗎?當你有很多實體時要小心使用Guid,它會消耗數據庫中的大量空間。對於99%的情況,int或long很好。 – andrecarlucci 2010-11-29 20:50:01

+0

上面的示例是從我在客戶端網站上處理的內容中提取的代碼的縮寫片段。我沒有選擇使用Guids作爲ID。那是我到達那裏時數據庫設計的一部分。我同意int或long會更好,但由於系統的限制,我們不得不使用Guids。 – Chazmanian 2011-01-03 15:04:36

0

中介模式(有關我們的複合應用程序的視圖之間的消息服務)完成這項工作。此外,委託在子窗口服務中創建詳細視圖並通過消息傳遞服務傳遞選定的對象。那麼你將不會得到任何模式違規。

相關問題