這是一個很常見的模式。這是我如何在WPF中完成的。
在主窗口的視圖模型中,應該有一個名爲Characters
的屬性,即ObservableCollection<CharacterViewModel>
。在視圖中,這是必然的某種物品控制,說一個ListBox
。對於CharacterViewModel
,有一個DataTemplate
,或者類實現ToString()
,這樣字符就可以有效地顯示。 ListBox
的SelectedItem
屬性綁定到視圖模型中的SelectedCharacter
屬性,以便每當用戶單擊列表框中的項目時,視圖模型就知道當前選定的字符是什麼。
主窗口視圖模型還實現了一個EditingCharacter
事件(它只是一個普通的事件處理程序)和EditCharacterCommand
(使用Josh Smith's RelayCommand
pattern),和它的伴隨的屬性和方法,例如:
public bool CanEditCharacter { get { return SelectedCharacter != null; } }
public void EditCharacter()
{
EventHandler h = EditingCharacter;
if (EditingCharacter != null)
{
EditingCharacter(this, EventArgs.Empty);
}
}
的EditCharacterCommand
是結合到視圖中的可點擊控件(例如按鈕或超鏈接)。
主窗口視圖實例主窗口視圖模型,並註冊了EditingCharacter
事件的處理程序:
private void ViewModel_EditingCharacter(object sender, EventArgs e)
{
CharacterViewModel cvm = ((MainWindowViewModel)sender).SelectedCharacter;
CharacterWindow cw = new CharacterWindow();
cw.ShowDialog(cvm);
}
(爲什麼要用一個事件,因爲使用的事件不斷創建和顯示窗的實施細則在視圖模型對象之外,CharacterViewModel
不需要知道任何關於如何編輯字符的細節,它只是引發一個事件,說「嗨,是時候編輯當前選擇的字符了。」這是由主窗口決定事件發生時要做什麼。)
CharacterWindow
實際上讓用戶編輯一個字符。其控件綁定到CharacterViewModel
的屬性。它實現的ShowDialog
過載:(從而有可能取消該對話框而不保存更改是讀者的練習)
public bool? ShowDialog(CharacterViewModel cvm)
{
DataContext = cvm;
return ShowDialog();
}
最後,你也實現在窗口視圖的AddCharacterCommand
模型 - 它創建一個新的CharacterViewModel
,將其添加到Characters
集合中,設置SelectedCharacter
,並提升EditingCharacter
。將其綁定到主窗口中的按鈕或超鏈接或菜單項,即可完成。
傳遞給構造函數 - 錯誤 – Snowbear 2011-02-06 01:29:53