繁体   English   中英

WPF 在 wpf 中使用 ViewModelLocator dll

[英]WPF using ViewModelLocator in a wpf dll

我有一个 WPF 库项目,其中有一组视图和视图模型。 在这个项目中,我想实现一个ViewModelLocator ( VML )。 但是,通过一些在线资源,我似乎需要有一个 App.xaml 并在这里声明我的定位器。

<Application.Resources>
        <ResourceDictionary>
            <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
        </ResourceDictionary>        
 </Application.Resources>

然后在我的视图(xaml)中我需要分配数据上下文

<UserControl.DataContext>
        <Binding Path="FooViewModel" Source="{StaticResource Locator}"/>
</UserControl.DataContext>

如果我在 WPF Window 应用程序中工作,这对我来说很有意义。 但是我如何在我的 dll 项目中实现 VML? 我尝试在我的 dll 项目中创建一个 App.xaml 文件并注入我的 VML 参考

<Application.Resources>
        <ResourceDictionary>
            <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
        </ResourceDictionary>        
</Application.Resources>

但是当我尝试在我的 FooViewModel.xaml 文件中引用我的定位器时,我得到一个

System.Windows.Markup.XamlParseException
Exception: Cannot find resource named 'Locator'. Resource names are case sensitive.

dll 项目中是否可以有 VML? 如果是这样,我错过了什么? 提前谢谢了!

您可以创建附加属性来设置控件库中视图的DataContext ,而不是使用ViewModelLocator资源:

namespace ControlsAndResources
{
    public class View
    {
        private static readonly ViewModelLocator s_viewModelLocator = new ViewModelLocator();

        public static readonly DependencyProperty ViewModelProperty = DependencyProperty.RegisterAttached("ViewModel", typeof(string), 
            typeof(ViewModelLocator), new PropertyMetadata(new PropertyChangedCallback(OnChanged)));

        public static void SetViewModel(UserControl view, string value) => view.SetValue(ViewModelProperty, value);

        public static string GetViewModel(UserControl view) => (string)view.GetValue(ViewModelProperty);

        private static void OnChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            UserControl view = (UserControl)d;
            string viewModel = e.NewValue as string;
            switch (viewModel)
            {
                case "MainViewModel":
                    view.DataContext = s_viewModelLocator.MainViewModel;
                    break;
                case "FooViewModel":
                    view.DataContext = s_viewModelLocator.FooViewModel;
                    break;
                default:
                    view.DataContext = null;
                    break;
            }
        }
    }
}

用法:

<UserControl xmlns:local="clr-namespace:ControlsAndResources" ... 
             local:View.ViewModel="MainViewModel">

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM