首先,你不需要任何的工具包/框架實現MVVM。它可以像這樣簡單...讓我們假設我們有一個MainViewModel
,PersonViewModel
和一個CompanyViewModel
,每個都有自己的相關視圖,並且每個都擴展了abstract
基類BaseViewModel
。
在BaseViewModel
中,我們可以添加公共屬性和/或ICommand
實例並實現INotifyPropertyChanged
接口。因爲它們都延長BaseViewModel
類,我們可以在這可設置爲任何我們認爲模型的MainViewModel
類此屬性:上正確
public BaseViewModel ViewModel { get; set; }
當然,你會實現INotifyPropertyChanged
接口您屬性不像這個快速的例子。現在,在App.xaml
,我們宣佈了一些簡單的DataTemplate
s到的意見與視圖模型連接:
<DataTemplate DataType="{x:Type ViewModels:MainViewModel}">
<Views:MainView />
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModels:PersonViewModel}">
<Views:PersonView />
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModels:CompanyViewModel}">
<Views:CompanyView />
</DataTemplate>
現在,無論我們用BaseViewModel
實例之一,我們的應用程序,這些DataTemplate
旨意告訴框架顯示相反的看法。我們可以這樣顯示出來:
<ContentControl Content="{Binding ViewModel}" />
因此,所有我們現在需要做的切換到一個新的觀點是從MainViewModel
類設置ViewModel
屬性:
ViewModel = new PersonViewModel();
最後,我們怎麼樣從其他視圖改變觀點?那麼有幾種可能的方法可以做到這一點,但最簡單的方法是將子視圖中的Binding
直接添加到MainViewModel
中的ICommand
。我用的是RelayComand
的定製版本,但你可以使用任何你喜歡的類型,我猜你會得到的圖片:
public ICommand DisplayPersonView
{
get { return new ActionCommand(action => ViewModel = new PersonViewModel(),
canExecute => !IsViewModelOfType<Person>()); }
}
在子視圖XAML:
<Button Command="{Binding DataContext.DisplayPersonView, RelativeSource=
{RelativeSource AncestorType={x:Type MainView}}, Mode=OneWay}" />
而已!請享用。
@AndrasSebö,在這個場合,我不同意你的看法。雖然我接受這不是一個很好的問題,但我已經看到了更糟糕的情況,而且我相信用戶之後很清楚。 – Sheridan
那麼問題是:我如何從視圖內切換視圖。 – user2499088
您是否找到解決此問題的好方法? – User1551892