Как реализовать инверсию управления c # - wpf - PullRequest
1 голос
/ 20 марта 2019

Я изучаю, как реализовать инверсию управления в приложении wpf по ссылке ниже

https://www.codeguru.com/columns/experts/implementing-the-inversion-of-control-pattern-in-c.htm

Цель приложения - загрузить данные из таблицы вполе со списком.Код работает нормально без каких-либо проблем.Поэтому, как часть изучения принципа проектирования ooad, я подумал ниже, что это идеальный случай, в котором модуль высокого уровня (Viewmodel) зависит от модуля нижнего уровня (populatetab2combobox).Я считаю, что здесь мы можем применить инверсию зависимости.при чтении в режиме онлайн большинство из них начали с инверсии управления в качестве первого шага к реализации инверсии зависимости.

Я просто хочу повторить, что у меня нет предыдущего опыта в принципе упс.Я могу ошибаться в своем предположении.Пожалуйста, исправьте меня, если я ошибаюсь.

Window.xaml:

  <ComboBox ItemsSource="{Binding populatecombobox.modeltogetusername}" Width="155" Margin="0,-20,-180,137">
                        <ComboBox.ItemTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding username}"/>
                            </DataTemplate>
                        </ComboBox.ItemTemplate>
                    </ComboBox>

Просмотреть модель:

Код без реализации инверсии управления (Это прекрасно работаетбез каких-либо проблем):

//Class to populate the combobox

public class populatetab2combobox
{
    public ObservableCollection<comboboxdata> modeltogetusername { get; set; }

    public void getdatausinglinq()
    {
        using (Operations_Productivity_ToolEntities context = new Operations_Productivity_ToolEntities())
        {
            var a1 = from t1 in context.Test_ImportedAuditdata
                     select t1;

            if (modeltogetusername == null)
                modeltogetusername = new ObservableCollection<comboboxdata>();

            foreach (var a in a1.GroupBy(x => x.username).Select(x => x.FirstOrDefault()))
            {
                modeltogetusername.Add(new comboboxdata
                {
                 username = a.username.ToString()
                });

            }
        }

    }

}


 public class ViewModel: INotifyPropertyChanged {

/** You can see that I'm calling viewModel class is depended with 
   populatetab2combobox. I believe this is the perfect case for implementing 
   Inversion of control **/

populatetab2combobox_populatecombobox = new populatetab2combobox();
private PopulateDatagrid _populatedatagridwithobservablecollection = new PopulateDatagrid();
private Loadfileintodatabase loaddata = new Loadfileintodatabase();

public PopulateDatagrid Populatedatagridwithobservablecollection {
    get {
        return _populatedatagridwithobservablecollection;
    }
    set {
        if (value != _populatedatagridwithobservablecollection) {
            _populatedatagridwithobservablecollection = value;
            OnPropertyChanged("Populatedatagridwithobservablecollection");
        }
    }
}


DataModel dm = new DataModel();

public ViewModel() {
    _populatecombobox.getdatausinglinq();
    DoSomeThingCmd = new RelayCommand(o = >search());
    _populatedatagridwithobservablecollection.getdatausinglinq();
}

#region INotifyPropertyChanged Members

public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName) {
    if (PropertyChanged != null) {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

#endregion
}
}

Код с реализацией инверсии управления (проблема в том, что выпадающий список пуст, когда я запускаю, когда реализован IOC):

public interface INofificationAction
{
     void getdatausinglinq();
}



public class populatetab2combobox : INofificationAction
{
    public ObservableCollection<comboboxdata> modeltogetusername { get; set; }

    public void getdatausinglinq()
    {
        using (Operations_Productivity_ToolEntities context = new Operations_Productivity_ToolEntities())
        {
            var a1 = from t1 in context.Test_ImportedAuditdata
                     select t1;

            if (modeltogetusername == null)
                modeltogetusername = new ObservableCollection<comboboxdata>();

            foreach (var a in a1.GroupBy(x => x.username).Select(x => x.FirstOrDefault()))
            {
                modeltogetusername.Add(new comboboxdata
                {
                 username = a.username.ToString()
                });

            }
        }

    }

}

 public class implementingabstraction
{
    INofificationAction _an;
    public implementingabstraction(INofificationAction action)
    {
        this._an = action;
    }

    public void getdatausinglinq()
    {
        _an.getdatausinglinq();
    }

}


public class ViewModel: INotifyPropertyChanged
{
INofificationAction getdata123 = new populatetab2combobox();

populatetab2combobox _populatecombobox = new populatetab2combobox();

public populatetab2combobox populatecombobox {
    get {
        return _populatecombobox;
    }
    set {
        if (value != _populatecombobox) {
            _populatecombobox = value;
            OnPropertyChanged("populatetab2combobox");
        }
    }
}

public RelayCommand DoSomeThingCmd {
    get;
    set;
}
DataModel dm = new DataModel();

public ViewModel() {

    implementingabstraction abs = new implementingabstraction(getdata123);
    abs.getdatausinglinq();
    DoSomeThingCmd = new RelayCommand(o = >search());
    _populatedatagridwithobservablecollection.getdatausinglinq();
}

}

вопросы:

1), поскольку я очень новичок в подходе на основе упс. Разве приведенный выше вариант использования верен.

2) Код вышене работает правильно.Можете ли вы указать на ошибку в моем подходе.

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