Saya tahu pertanyaan ini agak mendasar, tetapi saat ini, saya benar-benar bingung bagaimana cara menambahkan ViewModel baru ke kelas ViewModelLocator saya di MVVM
Light Toolkit.
Implementasi saya saat ini terlihat seperti ini:
Pertama-tama asumsikan bahwa saya memiliki Window bernama Settings
, ViewModel bernama SettingsViewModel
dan ViewModelLocator ViewModelLocator
.
Pertama saya memanggil CreateSettings()
di konstruktor VieModelLocator:
public ViewModelLocator()
{
if (ViewModelBase.IsInDesignModeStatic)
{
}
else
{
CreateSettings();
}
CreateMain();
}
Perhatikan bahwa ini akan selalu berjalan karena saya tidak menggunakan campuran dan membangun aplikasi setiap kali saya mencoba menjalankannya. Sekarang untuk metode `CreateSettings().
Saya tidak tahu apa yang saya lakukan, jadi saya mencoba bermain aman dan memodelkan semuanya berdasarkan metode yang digunakan untuk membuat dan mengelola MainViewModel.
public static void CreateSettings()
{
if (_settings == null)
{
_settings = new SettingsViewModel();
}
}
Kemudian beberapa metode lain yang meniru metode yang digunakan untuk MainViewModel:
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance",
"CA1822:MarkMembersAsStatic",
Justification = "This non-static member is needed for data binding purposes.")]
public SettingsViewModel Settings
{
get
{
return SettingsStatic;
}
}
public static SettingsViewModel SettingsStatic
{
get
{
if (_settings == null)
{
CreateSettings();
}
return _settings;
}
}
Dan di Settings
Window Xaml saya:
<Window x:Class="_5500A_Auto_Calibrator.Settings"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Settings" Height="300" Width="300"
DataContext="{Binding Source={StaticResource Locator}, Path=Settings}">
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Skins/MainSkin.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
Jendela kemudian dibuka dari MainViewModel saya seperti:
Settings settings = new Settings();
settings.Show();
Jika saya mencoba ini, saya menerima pengecualian:
"'Provide value on 'System.Windows.StaticResourceExtension' threw an exception.' Line number '4' and line position '39'."
Dan pengecualian dalam:
"Cannot find resource named 'Locator'. Resource names are case sensitive."
Saya telah membaca tentang kesalahan yang melibatkan ketidakmampuan Window untuk menemukan sumber daya Locator
, tetapi sebagian besar berkaitan dengan campuran.
Pendapat saya saat ini adalah bahwa saya melakukan sesuatu yang salah, tetapi hanya ada sedikit dokumentasi mengenai penambahan ViewModels baru sehingga saya tidak yakin apa kesalahan yang saya lakukan.
Sunting:
Aplikasi Saya.Xaml:
<Application x:Class="_5500A_Auto_Calibrator.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:_5500A_Auto_Calibrator.ViewModel"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
StartupUri="MainWindow.xaml"
mc:Ignorable="d">
<Application.Resources>
<!--Global View Model Locator-->
<vm:ViewModelLocator x:Key="Locator"
d:IsDataSource="True" />
</Application.Resources>
</Application>