2012-01-11 198 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可以看到它。