Saya memiliki sebuah aplikasi WPF dengan beberapa pandangan. Saya ingin beralih dari view 1 view 2 dan dari sana saya dapat beralih ke beberapa pandangan. Jadi saya ingin tombol pada tampilan 1 yang memuat view2 di jendela yang sama.
Saya mencoba hal-hal, tetapi dapat't mendapatkan itu untuk bekerja.
Dari link pertama, masalahnya adalah bahwa saya don't memahami ViewModelLocator kode. Mereka sebut CreateMain();
fungsi tapi di mana hal ini telah ditetapkan, dan bagaimana saya dapat beralih ke tampilan lain dari dalam sebuah view.
Pertama, anda don't membutuhkan salah satu dari mereka toolkit/kerangka untuk menerapkan MVVM. Hal ini dapat sebagai sederhana seperti ini... let's asumsikan bahwa kita memiliki MainViewModel
, dan PersonViewModel
dan CompanyViewModel
, masing-masing dengan mereka sendiri terkait dengan pandangan dan masing-masing memperpanjang abstrak
base class BaseViewModel
.
Di BaseViewModel
, kita dapat menambahkan sifat-sifat umum dan/atau ICommand
contoh dan menerapkan INotifyPropertyChanged
antarmuka. Karena mereka semua memperpanjang BaseViewModel
kelas, kita dapat memiliki properti ini dalam MainViewModel
kelas yang dapat diatur untuk salah satu dari kami melihat model:
public BaseViewModel ViewModel { get; set; }
Tentu saja, anda'a yang akan melaksanakan INotifyPropertyChanged
antarmuka dengan benar pada anda * sifat-sifat seperti ini contoh cepat. Sekarang di App.xaml
, kami menyatakan beberapa sederhana `DataTemplate untuk menghubungkan pandangan dengan melihat model:
<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>
Sekarang, di manapun kita gunakan salah satu dari kami BaseViewModel
contoh dalam aplikasi kami, ini `DataTemplate ini akan memberitahu rangka untuk menampilkan terkait melihat sebaliknya. Kita dapat menampilkan mereka seperti ini:
<ContentControl Content="{Binding ViewModel}" />
Jadi semua yang perlu kita lakukan sekarang untuk beralih ke tampilan baru adalah untuk mengatur ViewModel
properti MainViewModel
kelas:
ViewModel = new PersonViewModel();
Akhirnya, bagaimana kita mengubah pandangan dari pandangan lain? Nah ada beberapa cara yang mungkin untuk melakukan hal ini, tetapi cara termudah adalah dengan menambahkan Mengikat
dari anak-anak melihat langsung ke ICommand
di MainViewModel
. Saya menggunakan versi kustom dari RelayComand
, tetapi anda dapat menggunakan jenis apapun yang anda suka dan I'm menebak bahwa anda'll mendapatkan gambar:
public ICommand DisplayPersonView
{
get { return new ActionCommand(action => ViewModel = new PersonViewModel(),
canExecute => !IsViewModelOfType<Person>()); }
}
Anak-anak melihat XAML:
<Button Command="{Binding DataContext.DisplayPersonView, RelativeSource=
{RelativeSource AncestorType={x:Type MainView}}, Mode=OneWay}" />
Yang's itu! Menikmati.
Ketika saya pertama kali mulai dengan MVVM saya juga berjuang dengan berbagai MVVM-kerangka dan terutama navigasi bagian. Oleh karena itu saya menggunakan ini sedikit tutorial yang saya temukan, bahwa Rachel Lim telah dibuat. It's sangat bagus dan menjelaskan dengan baik.
Lihat pada link berikut:
Berharap itu membantu anda :)
Mungkin ini link akan membantu anda. Hanya mengatur NavigateTo
properti untuk melihat mana anda perlu untuk ditampilkan pada jendela.
Sebagai contoh anda dapat melakukan sesuatu seperti
<Window x:Class="MainWindowView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:meffed="http:\\www.codeplex.com\MEFedMVVM"
meffed:ViewModelLocator.NonSharedViewModel="YourViewModel"
WindowStartupLocation="CenterScreen">
<Button meffed:NavigationExtensions.NavigateTo="firstview"
meffed:NavigationExtensions.NavigationHost="{Binding ElementName=_viewContainer}"
meffed:NavigationExtensions.NavigateOnceLoaded="False"
Visibility="Visible" />
<ContentControl x:Name="_viewContainer" Margin="0,0,0,10" />
<Window>
Maka file kelas akan
public partial class MainWindowView : Window
{
public MainWindowView()
{
InitializeComponent();
}
public ContentControl ViewContainer { get { return _viewContainer; } }
}
Kemudian anda dapat menentukan setiap tampilan sebagai UserControl
dan kemudian menggunakan link yang saya berikan di atas mengikat tombol's meffed:NavigationExtensions.NavigateTo="secondView"
. Untuk target ContentControl
dari Jendela
hanya menggunakan RelativeSource
mengikat. Untuk e.g
meffed:NavigationExtensions.NavigationHost="{Mengikat RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Tipe Jendela}},Path=ViewContainer"
Di masing-masing melihat hanya melihat bahwa anda membubuhi keterangan kode kelas di belakang definisi dengan [NavigationView("firstview")]
dan sebagainya.
Hal ini rumit untuk pertama kalinya, tapi itu akan sangat mudah sekali anda memahami ide.