MVVM-Light 和 WPF 用户控件库
MVVM-Light and WPF User control library
我将不得不在独立的用户控件库中创建一个 WPF 用户控件。
我想使用 MVVM-light。
问题,SimpleIOC 通常在主应用程序中设置,并通过 app.xaml.
作为资源添加到主应用程序
如何最好地解决它,以便引用的用户控件库可以访问 SimpleIOC 容器?
在哪里注册用户控件的 ViewModel 最好?
我发现以下线程似乎是同一个问题,但是在答案post中提供的link中不再有任何关于解决方案的信息。
How can MVVM Light be used in a WPF User Control Library project?
不太清楚您的哪一部分有问题。您库中的视图模型可以像任何其他视图模型一样注册:
SimpleIoc.Default.Register<MainViewModel>();
SimpleIoc.Default.Register<YourClassLibrary.YourClassLibViewModel>();
... etc ...
如果您的 class 库有需要包含在主应用程序资源字典中的对象(即 DataTemplates 等),那么将它们放入 ResourceDictionary 中,就像您通常在 App.xaml 中所做的那样。 ...
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:YourClassLibrary">
<DataTemplate DataType="{x:Type local:YourClassLibViewModel}">
<local:YourClassLibUserControl />
</DataTemplate>
</ResourceDictionary>
...然后将其添加到主应用程序的 ResourceDictionary 的 MergedDictionaries
列表中:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/YourClasssLibrary;component/YourResourceDictionary.xaml" />
</ResourceDictionary.MergedDictionaries>
<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" xmlns:vm="clr-namespace:YourMainApp.ViewModel" />
</ResourceDictionary>
</Application.Resources>
如果独立 class 库中的视图依赖于视图模型定位器,而视图模型定位器又依赖于视图模型 classes,您可以定义 ViewModelLocator
class 作为视图模型项目中的单例并从用户控件库和 WPF 应用程序本身引用该项目:
ViewModels/ViewModelLocator.cs:
public sealed class ViewModelLocator
{
private static readonly ViewModelLocator _instance = new ViewModelLocator();
private ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<MainViewModel>();
}
public static ViewModelLocator Instance => _instance;
public MainViewModel Main
{
get
{
return ServiceLocator.Current.GetInstance<MainViewModel>();
}
}
}
Views/UserControl1.xaml:
<UserControl x:Class="Views.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:viewModels="clr-namespace:ViewModels;assembly=ViewModels"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300"
DataContext="{Binding Main, Source={x:Static viewModels:ViewModelLocator.Instance}}">
<Grid>
</Grid>
</UserControl>
WpfApp4/MainWindow.xaml:
<Window x:Class="WpfApp4.MainWindow"
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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:views="clr-namespace:Views;assembly=Views"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid>
<views:UserControl1 />
</Grid>
</Window>
我将不得不在独立的用户控件库中创建一个 WPF 用户控件。 我想使用 MVVM-light。 问题,SimpleIOC 通常在主应用程序中设置,并通过 app.xaml.
作为资源添加到主应用程序如何最好地解决它,以便引用的用户控件库可以访问 SimpleIOC 容器? 在哪里注册用户控件的 ViewModel 最好?
我发现以下线程似乎是同一个问题,但是在答案post中提供的link中不再有任何关于解决方案的信息。 How can MVVM Light be used in a WPF User Control Library project?
不太清楚您的哪一部分有问题。您库中的视图模型可以像任何其他视图模型一样注册:
SimpleIoc.Default.Register<MainViewModel>();
SimpleIoc.Default.Register<YourClassLibrary.YourClassLibViewModel>();
... etc ...
如果您的 class 库有需要包含在主应用程序资源字典中的对象(即 DataTemplates 等),那么将它们放入 ResourceDictionary 中,就像您通常在 App.xaml 中所做的那样。 ...
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:YourClassLibrary">
<DataTemplate DataType="{x:Type local:YourClassLibViewModel}">
<local:YourClassLibUserControl />
</DataTemplate>
</ResourceDictionary>
...然后将其添加到主应用程序的 ResourceDictionary 的 MergedDictionaries
列表中:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/YourClasssLibrary;component/YourResourceDictionary.xaml" />
</ResourceDictionary.MergedDictionaries>
<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" xmlns:vm="clr-namespace:YourMainApp.ViewModel" />
</ResourceDictionary>
</Application.Resources>
如果独立 class 库中的视图依赖于视图模型定位器,而视图模型定位器又依赖于视图模型 classes,您可以定义 ViewModelLocator
class 作为视图模型项目中的单例并从用户控件库和 WPF 应用程序本身引用该项目:
ViewModels/ViewModelLocator.cs:
public sealed class ViewModelLocator
{
private static readonly ViewModelLocator _instance = new ViewModelLocator();
private ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<MainViewModel>();
}
public static ViewModelLocator Instance => _instance;
public MainViewModel Main
{
get
{
return ServiceLocator.Current.GetInstance<MainViewModel>();
}
}
}
Views/UserControl1.xaml:
<UserControl x:Class="Views.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:viewModels="clr-namespace:ViewModels;assembly=ViewModels"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300"
DataContext="{Binding Main, Source={x:Static viewModels:ViewModelLocator.Instance}}">
<Grid>
</Grid>
</UserControl>
WpfApp4/MainWindow.xaml:
<Window x:Class="WpfApp4.MainWindow"
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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:views="clr-namespace:Views;assembly=Views"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid>
<views:UserControl1 />
</Grid>
</Window>