2010-09-07 34 views
2

我不知道你是如何做這樣的事情的。假設,我們有修改樹的MVVM CRUD應用程序(例如,菜單結構)。我們有一個包含菜單項和兩個視圖的視圖模型:第一個爲TreeView,第二個爲DataForm。主要問題是:當選擇更改時,自動取消DataForm中的更改

  1. DataForm無法處理 分層數據。
  2. 根據菜單項中選擇的TreeViewDataForm 應(菜單項 與兒童或不例如)顯示不同的一組 字段。

我已經結束了以下。視圖模型有3個領域:

  1. Items - 有他們自己的 收集Children爲 構建分層數據源 MenuItem對象的集合。
  2. SelectedItem - 當前選擇 MenuItemTreeView
  3. ​​- EditViewModel 對象基本上具有兩個 後代:MenuItemEditViewModelLeafMenuItemEditViewModel。 當SelectedItem被更改時,此屬性被自動設置爲 。它的 實際類型是從 SelectedItem.Children空虛推斷出來的。

TreeView綁定到ItemsSelectedItem。在這種情況下,不需要使用DataForm來維護貨幣(而不是當前項目由TreeView設置),也不需要負責創建和刪除項目。這就是爲什麼我決定只綁定其CurrentItem查看模型的​​(ItemsSource是未綁定)。其AutoCommit設置爲False(當它是TrueItemsSource未綁定時,當您在TreeView中選擇不同的項目時,所有當前項目更改將被複制到新選擇的項目,這並不好)。 DataForm字段是自動生成的。

顯然,現在如果我們選擇在TreeView一個項目,然後讓在DataForm一些變化,並嘗試在TreeView,我們將得到著名

無法更改貨幣時選擇不同的項目一個項目 有驗證錯誤,或正在編輯 ,並且AutoCommit爲false。設置 的ItemsSource到ICollectionView到 管理貨幣,而不是

在這種情況下,我想DataForm隱式地放棄所有更改。有一種解決方法,在之前調用DataForm.CancelEdit()所選項目被更改(通常是類似PreviewSelectionChangedBeforeSelectionChanged的事件)。但它不是MVVM的方式,因爲TreeViewDataForm在完全不同的視圖中定義(讀取:不可接受)。

是否有像AutoCancel這樣強制DataForm取消其更改CurrentItem更改?也許有人從開發團隊可以回答?或者你會如何處理這樣的問題?

+0

錯誤消息很明顯:您需要堅持使用美元。正在編輯項目並且AutoCommit爲false時,您無法切換到歐元! :) – Skrymsli 2011-07-27 05:25:59

回答

0

您是否嘗試將AutoCommit設置爲True?

+0

是的,這不是一個解決方案。我提到它:「當它爲True且ItemsSource被解除綁定時,當您在TreeView中選擇不同的項目時,所有當前項目更改都會被複制到新選擇的項目,這不太好」 – 2010-10-22 15:19:12

4

考慮到所有面向業務的RIA功能,我很驚訝地發現Silverlight嚴重缺乏這種功能。我不接受AutoCommit,因爲我希望用戶明確地確認掛起的更改,而不是僅僅向數據庫提交他們可能不需要的內容。

您可以使用私有成員變量和捕捉數據形(命名不一致的BeginningEdit和EditEnded事件可靠地跟蹤數據形的編輯模式!爲什麼一個被稱爲xxxEdit,其餘爲Editxxx是超越我。如果它不是EditBeginning和EditEnded ??)。在BeginningEdit的事件處理程序中,將該標誌設置爲true,並在EditEnded中將其設置爲false。

在您的SelectionChanged事件中,您可以檢查標誌。如果是這樣,您可以調用DataForm上的CancelEdit。

private bool _editing = false; 

public MainPage() { 
    DataForm1.BeinningEdit += 
     new EventHandler<CancelEventArgs>(DataForm1_BeginningEdit); 
    DataForm1.EditEnded += 
     new EventHandler<DataFormEditEndedEventArgs>(DataForm1_EditEnded); 
} 

protected void DataForm1_BeginningEdit(object sender, 
    System.ComponentModel.CancelEventArgs e) { 
    _editing = true; 
} 

protected void DataForm1_EditEnded(object sender, 
    DataFormEditEndedEventArgs e) { 
    _editing = false; 
} 

void TreeView1_SelectedItemChanged(object sender, 
    RoutedPropertyChangedEventArgs<object> e) 
{ 
    if (_editing) { 
     object previous = DataForm1.SelectedItem; 
     object current = TreeView1.SelectedItem; 

     if (MessageBox.Show("Are you sure you want to cancel the changes?", 
      "Confirm", MessageBoxbutton.OKCancel) == MessageBoxResult.OK) { 
      DataForm1.CancelEdit(); 
     } 
     else { 
      TreeView1.SelectedItem = previous; 
     } 
    } 
} 
+0

Thanx!但是我已經改變了DataForm源碼來滿足我的需求。我絕對喜歡你的建議,要求用戶確認(在我目前的情況下,如果用戶沒有明確地保存它們,所有更改都會被取消)。 – 2010-11-30 14:28:45