2013-10-22 44 views
1

在我的應用程序中,我有2個視圖。列表(GridView)和表單。 WPF MVVM switch usercontrols在視圖模型之間傳遞參數

現在我有一個問題,如何通過選擇項目的ID點擊編輯後,以顯示與編輯表單新的觀點:由於在這個線程建議我改變看法。

簡單的應用程序列出所有項目,添加新的,刪除和編輯。我如何在MVVWM中做到這一點?


UPDATE

我只是想創建一個簡單的應用程序,對剩下的菜單:

  1. 列表
  2. 新增。

當點擊列表時,它顯示UC列表和3個按鈕:添加,編輯,刪除。點擊添加後,編輯它顯示具有特定值(編輯時)的窗體的UC。我怎樣才能做到這一點?

+0

您的視圖模型之間是否有共同的父項? – Sheridan

+0

我有MainWindow與ObservableCollection的其他ViewModels和在窗口的右側我有: Chris

+0

迴應您的評論,我現在已添加到您的問題,我強烈建議您編輯您的問題,並向我們展示您嘗試使用本網站的慣例。 – Sheridan

回答

8

如果您擁有視圖模型的通用父項,那麼您可以使用該父項爲您傳遞參數值。只需在相關視圖模型建立了一個或多個delegate S:

與有關參數來更新視圖模型......讓我們把它ParameterViewModel

public delegate void ParameterChange(string parameter); 

public ParameterChange OnParameterChange { get; set; } 

在父:

ParameterViewModel viewModel = new ParameterViewModel(); 
viewModel.OnParameterChange += ParameterViewModel_OnParameterChange; 
ListMenu.Add(viewModel); 
// Add other view models 

早在ParameterViewModel當參數變化:

public string Parameter 
{ 
    get { return parameter; } 
    set 
    { 
     parameter = value; 
     NotifyPropertyChanged("Parameter"); 
     // Always check for null 
     if (OnParameterChange != null) OnParameterChange(parameter); 
    } 
} 

現在父視圖模型:

public void ParameterViewModel_OnParameterChange(string parameter) 
{ 
    // Do something with the new parameter data here 
    AnotherViewModel anotherViewModel = (AnotherViewModel)ListMenu[someIndex]; 
    anotherViewModel.Parameter = parameter; 
} 

你可以找到更多關於使用從Delegates (C# Programming Guide)頁面上MSDN delegate對象。

+0

我只是想創建一個簡單的應用程序,它的菜單左邊有:1.列表2.添加新的。當點擊列表時,它顯示UC列表和3個按鈕:添加,編輯,刪除。點擊添加後,編輯它顯示具有特定值(編輯時)的窗體的UC。我怎樣才能做到這一點? – Chris

+2

這就是爲什麼在用戶花時間回答您的原始問題之後,您應該將所有這些(新)信息放入您的問題中,而不是發表評論。 – Sheridan

10

據我瞭解,你想是這樣的:

Main screen showing the list 這樣當你點擊Add,就說明這一點: Main screen showng the add form

,對嗎?

所以你需要以下行爲:

  • 添加並不需要任何ID。
  • 列表必須在添加完成後重新加載。
  • 編輯接收列表中選擇的項目標識。
  • 列表必須在添加完成後重新加載。

我會假設您正在使用某個存儲庫。

我提出以下MVVM結構:主屏幕的DataContext:

  • MainViewModel
    • BaseViewModel RightViewModel:視圖模型的容器顯示在屏幕的右側部分。
    • ICommand ViewListCommand:通過創建ListViewModel的新實例並將其分配給BaseViewModel屬性來顯示該列表。
    • ICommand AddNewCommand:通過創建AddViewModel的新實體並將其分配給BaseViewModel屬性來顯示添加新屏幕。

然後:

  • ListViewModel:單擊列表時,在屏幕的右側部分的DataContext的。
    • List<Items> Items:提供要顯示的項目。
    • Item SelectedItem:將綁定到UI上的SelectedItem的屬性。
    • ICommand EditCommand:將獲取所選項目並通知必須編輯的MainViewModel的命令。

所以,在某些時候,一個視圖模型將接收來自子視圖模型的通知(即列表會告訴主編輯事端)。我建議用事件來做到這一點:

public class Item 
{ 
    public string Name { get; set; } 
} 

public class ItemEventArgs : EventArgs 
{ 
    public Item Item { get; set; } 

    public ItemEventArgs(Item selectedItem) 
    { 
     this.Item = selectedItem; 
    } 
} 

public class BaseViewModel 
{ 

} 

public class ListViewModel : BaseViewModel 
{ 
    public event EventHandler<ItemEventArgs> EditItem; 

    public Item SelectedItem { get; set; } 

    public ICommand EditItemCommand { get; private set; } 

    public ListViewModel() 
    { 
     this.EditItemCommand = new DelegateCommand(() => this.EditItem(this, new ItemEventArgs(this.SelectedItem))); 
    } 
} 

public class EditViewModel : BaseViewModel 
{ 

} 

public class MainViewModel 
{ 
    public BaseViewModel RightViewModel { get; private set; } 

    public ICommand ViewListCommand { get; private set; } 

    public MainViewModel() 
    { 
     this.ViewListCommand = new DelegateCommand(() => 
     { 
      // unhook possible previous events 
      var listViewModel = new ListViewModel(); 
      listViewModel.EditItem += listViewModel_EditItem; 
      this.RightViewModel = listViewModel; 
     }); 
    } 

    void listViewModel_EditItem(object sender, ItemEventArgs e) 
    { 
     // unhook possible previous events 
     var editViewModel = new EditViewModel(); 
     this.RightViewModel = editViewModel; 
    } 

} 

的XAML綁定是沒有必要的,因爲這將是相當向前。

這是一個非常基本的例子,我認爲這種東西可以被處理。這裏重要的是要正確地解開事件,否則你可能會遇到問題。你可以看看Reactive UI

+1

優雅的解決方案,這是我會做的。 –

相關問題