2012-01-11 143 views
0

我一直在学习MVVM/WPF,并通过了教程here依赖注入不工作

我已经创建了一个使用此方法的工作应用程序,但现在,在一个新项目上,我无法使依赖注入工作。

当我运行这个项目时,我得到一个空的MainWindow,没有注入CompanyView。我有两倍和三倍检查项目之间的一切工作,这一个没有,也找不到没有注入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

我注意到你有行''。它不应该是具有's'的ViewModels吗? – 2012-01-11 19:54:07

+0

我没有看到_repository正在创建的位置... – 2012-01-11 19:55:14

+0

Lester:我改正了这个,但它仍然不起作用。 – BrianKE 2012-01-11 20:03:18

回答

3

除了@Robert Levy写的,你犯的错误是你的ViewModels属性是私人的,使它公开,它应该工作正常。

+0

谢谢大家的帮助。我知道这很简单。 – BrianKE 2012-01-12 12:43:45

4

Lester的评论是正确的...你要绑定到不存在的ViewModel属性 - MainWindowViewModelViewModels财产虽然。 s很重要

1

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