[英]WPF MVVM - Accessing properties of other ViewModels using delegates
[英]Accessing Properties in other ViewModels in MVVM Light
我有一個主ViewModel
其中包含我正在一定數量的UserControls
使用的項的列表,這些項顯示在主視圖的ContentControl
。 我的電流之間交換數據的方式ViewModels
存在使得對每個的一個參考的ViewModels
在主ViewModel
,主要的一個ViewModel
在每一個UserControl
。 但是我不知道這是這樣做的正確方法,因為我有一個ViewModelLocator
並且我有點希望此類具有某些功能來支持此類功能。
誰能告訴我我在做什么,還是在MVVM Light中有更好的方法?
編輯:
我在尋找其他東西時發現了這個,這會是一個更好的解決方案嗎?
private ViewModelLocator locator = new ViewModelLocator();
然后使用定位器屬性來引用每個ViewModel?
編輯2:
顯然我認為不會起作用,起初,我在主ViewModel
僅具有引用,並且起作用了,但是當我在UserControls
嘗試該操作時,它會使我的應用程序崩潰。 我目前正在嘗試首次編輯的可能解決方案。
MainViewModel.cs(其他類似,僅參考主ViewModel)
public class MainViewModel : ViewModelBase
{
private ItemAddViewModel itemAddViewModel;
private ItemsViewModel itemsViewModel;
/// <summary>
/// Initializes a new instance of the MainViewModel class.
/// </summary>
public MainViewModel()
{
ItemsList = Item.GetItemsList();
itemAddViewModel = ServiceLocator.Current.GetInstance<ItemAddViewModel>();
itemsViewModel = ServiceLocator.Current.GetInstance<ItemsViewModel>();
ShowItemsView();
}
...
private void ShowItemsView()
{
CurrentControl = itemsViewModel;
}
...
您實際上可以使用ViewModelLocator。 默認情況下是使用“控制容器反轉”,因此,即使您創建了定位器的新實例,也將從容器中獲得相同的單例視圖模型實例。
Locator類:
static ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<ViewModel1>();
SimpleIoc.Default.Register<ViewModel2>();
SimpleIoc.Default.Register<ViewModel3>();
}
public ViewModel1 ViewModel1
{
get
{
return ServiceLocator.Current.GetInstance<ViewModel1>();
}
}
public ViewModel2 ViewModel2
{
get
{
return ServiceLocator.Current.GetInstance<ViewModel2>();
}
}
public ViewModel3 ViewModel3
{
get
{
return ServiceLocator.Current.GetInstance<ViewModel3>();
}
}
然后可以從代碼中訪問它
var vm1 = (new ViewModelLocator ()).ViewModel1;
您將獲得viewmodel的唯一實例。
來自xaml:資源(默認位於App.xaml中的Application.Resources中)
<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
和用於視圖的DataContext(用戶控件或Windows或其他任何控件)
<UserControl
...
DataContext="{Binding ViewModel1, Source={StaticResource Locator}}"
... >
如果您只需要在內容控件內部綁定主視圖模型的屬性,則只需使用以下語法:
... Binding="{DataContext.mainvmpropertyname, ElementName=xxxx}"
其中xxxx是附加到內容控件(或任何具有主viewmodel作為其DataContext的控件)的名稱。 或者,您可以使用相對綁定代替元素名稱。
您可以通過從Apps資源獲取Locator來以編程方式訪問ViewModel Locator的公共屬性:
MyViewModel vm = (App.Current.Resources["Locator"] as ViewModelLocator).MyViewModel
或通過在ViewModelLocator類中創建另一個靜態實例:
public class ViewModelLocator
{
public static ViewModelLocator Instance = new ViewModelLocator();
static ViewModelLocator(){ ... }
public MainViewModel Main
{
...
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.