依赖注入不起作用

时间:2012-01-11 19:42:49

标签: wpf mvvm dependency-injection

我一直在学习MVVM / WPF,并完成了教程here

我使用这种方法创建了一个有效的应用程序但现在,在一个新项目中,我无法使用依赖注入工作。

当我运行这个项目时,我得到一个没有注入CompanyView的空MainWindow。我有两倍和三倍检查项目之间的所有工作和这个没有,也无法找到没有注入CompanyView的原因。我也试过清理解决方案并重新启动VS无济于事。希望有人能看到我所缺少的东西。

我有以下文件:

App.xaml.cs (在App.xaml中使用base.OnStartup()而不是StartupUri)

namespace SidekickAdmin
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {

        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            MainWindow window = new MainWindow();
            var viewModel = new MainWindowViewModel();
            window.DataContext = viewModel;
            window.Show();
        }

    }
}

MainWindowViewModel.cs

namespace SidekickAdmin.ViewModel
{
    class MainWindowViewModel : ViewModelBase
    {
        public MainWindowViewModel()
        {
            CompanyViewModel companyViewModel = new CompanyViewModel(_repository);
            this.ViewModels.Add(companyViewModel);

        }

        ObservableCollection<ViewModelBase> _viewModels;
        ObservableCollection<ViewModelBase> ViewModels
        {
            get
            {
                if (_viewModels == null)
                {
                    _viewModels = new ObservableCollection<ViewModelBase>();
                }
                return _viewModels;
            }
        }
    }
}

MainWindowView.xaml

<Window x:Class="SidekickAdmin.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:vm="clr-namespace:SidekickAdmin.ViewModel"
        xmlns:vw="clr-namespace:SidekickAdmin.View"
        Title="Sidekick Admin" SizeToContent="WidthAndHeight">

    <!-- Typically done in a resources dictionary -->
    <Window.Resources>
        <ResourceDictionary Source="MainWindowResources.xaml" />
    </Window.Resources>


    <StackPanel>
        <ItemsControl ItemsSource="{Binding ViewModel}" Margin="3" /> 
    </StackPanel>

</Window>

MainWindowResources.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:vm="clr-namespace:SidekickAdmin.ViewModel"
                    xmlns:vw="clr-namespace:SidekickAdmin.View">

    <DataTemplate DataType="{x:Type vm:CompanyViewModel}">
        <vw:CompanyView />
    </DataTemplate>

</ResourceDictionary>

CompanyViewModel.cs (尚未真正使用,因为我仍然试图让视图显示)

namespace SidekickAdmin.ViewModel
{

    class CompanyViewModel : ViewModelBase
    {
        readonly GenericRepository _repository;

        #region Getters & Setters
        public ObservableCollection<Company> AllCompanies
        {
            get;
            private set;
        }

        #endregion

        #region Constructors
        public CompanyViewModel(GenericRepository repository)
        {

            if (repository == null)
            {
                throw new ArgumentNullException("repository");
            }

            _repository = repository;

            this.AllCompanies = new ObservableCollection<Company>(_repository.GetAll<Company>());
        }

        #endregion


        protected override void OnDispose()
        {
            this.AllCompanies.Clear();
        }

    }
}

CompanyView.xaml

<UserControl x:Class="SidekickAdmin.View.CompanyView"
             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" 
             mc:Ignorable="d" 
             Height="300" Width="300">

    <StackPanel>
        <TextBlock>You say Hello</TextBlock>
        <TextBlock>And I say Goodbye</TextBlock>    
        <TextBlock>Hello, Hello</TextBlock>
    </StackPanel>

 </UserControl>

3 个答案:

答案 0 :(得分:4)

Lester的评论是正确的......你绑定了一个不存在的ViewModel属性 - MainWindowViewModel但是有一个ViewModels属性。这很重要

答案 1 :(得分:3)

除了@Robert Levy所写的内容之外,您所犯的错误是您的ViewModels属性是私有的,将其公开并且应该可以正常工作。

答案 2 :(得分:1)

@RobertLevy和@dmusial是正确的。您需要在XAML复数中引用ViewModel,以匹配C#代码中的属性名称。此外,该属性应该是公共的,因此View可以看到它。