Инъекция зависимостей не работает - PullRequest
0 голосов
/ 11 января 2012

Я изучаю MVVM / WPF и прошел обучение здесь .

Я создал работающее приложение, используя эту методологию, но теперь, в новом проекте, я не могу заставить работать Dependency Injection.

Когда я запускаю этот проект, я получаю пустое MainWindow без добавления CompanyView. Я дважды и трижды проверил все, что находится между проектом, который работает, и тем, который не работает и не может найти причину, по которой CompanyView не вводится. Я также попытался очистить решение и перезапустить VS безрезультатно. Надеюсь, кто-нибудь увидит, чего мне не хватает.

У меня есть следующий файл:

App.xaml.cs (с использованием base.OnStartup () вместо StartupUri в App.xaml)

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 ]

4 голосов
/ 11 января 2012

Комментарий Лестера верен ... вы привязываетесь к несуществующему свойству ViewModel - у MainWindowViewModel есть свойство ViewModels. С важно

3 голосов
/ 12 января 2012

Помимо того, что написал @Robert Levy, ошибка, которую вы делаете, заключается в том, что ваше свойство ViewModels является частным, сделайте его публичным, и оно должно нормально работать.

1 голос
/ 12 января 2012

@ RobertLevy и @dmusial верны.Вам нужно сделать ссылку на ViewModels во множественном числе XAML, чтобы соответствовать имени свойства в вашем коде C #.Кроме того, свойство должно быть общедоступным, чтобы представление могло его видеть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...