Реализовать INotifyPropertyChanged в списке объектов? - PullRequest
0 голосов
/ 21 сентября 2018

Хм, не уверен, что выбрал правильный подход.У меня есть сетка компонентов.В первом столбце есть DatePickers .Во втором столбце есть поля со списком .В последнем столбце есть текстовые поля .Сетка имеет 15 рядов.Я назвал их по столбцу и номеру строки, как если бы вы указывали ячейки в сетке.Таким образом, dp1_1 для DatePicker - это позиция (1,1), dp2_1 для позиции (2,1).cb1_1 для ComboBox - это позиция (1,1), cb2_1 для ComboBox - позиция (2,1).

Я сохраняю свои данные выбора даты, данные поля со списком, текстовые поля данных в обычном списке для легкого доступа / ссылки, например так:

public int numOfRows = 15;
private List<DateTime> _MyDateTimeList = new List<DateTime>();

public List<DateTime> MyDateTimeList
{
    get { return _MyDateTimeList; }
    set {
        DateTime pomDatumObjava;

        _MyDateTimeList = value;

        for (int i = 0; i < numOfRows; i += 1)
        {
            pomDatumObjava = new DateTime();
            // code for accessing/enabling/disabling the appropriate date picker, which doesn't work since I don't know how to send the window reference where my date pickers reside
            // pomDatumObjava = Utils.enableDisableDatePicker(null, Constants.DP_LABEL + stringIndex, true, 1).SelectedDate.Value;
            _MyDateTimeList.Add(pomDatumObjava);
        }

        OnPropertyChanged("MyDateTimeList");
    }
}

public event PropertyChangedEventHandler PropertyChanged;

public void OnPropertyChanged(string name)
{
    Console.WriteLine("OnPropertyChanged -> " + name);
    PropertyChangedEventHandler handler = PropertyChanged;

    if (handler != null)
    {
        Console.WriteLine("handler != null -> " + name);
        handler(this, new PropertyChangedEventArgs(name));
    }
}

public static DatePicker enableDisableDatePicker(System.Windows.Window myWindow, string name, bool enableDisable, double op)
{
    DatePicker dp = (DatePicker)myWindow.FindName(name);

    if (!enableDisable)
    {
        dp.SelectedDate = null;
    }

    dp.IsEnabled = enableDisable;
    dp.Opacity = op;

    return dp;
}

Как мне получить доступ к моим компонентам в окне и ссылаться на них соответствующим образом, чтобы каждый раз, когда я изменял значение в определенномDatePicker, я обнаружил изменение в списке?

Вы можете найти функцию Utils в строке комментариев.Там, где написано null, должны быть объекты окна, где размещены мои компоненты.

Или это правильный подход?

У меня будет много компонентов (15x3 = 45 x код для OnPropertyChanged), поэтому файл MVVM будет достаточно большим, чтобы установить OnPropertyChanged () для всех из них.

1 Ответ

0 голосов
/ 21 сентября 2018

Как говорит ASh, вам нужна ObservableCollection объектов, по одному на каждую строку.ObservableCollections автоматически обновляет связанные элементы управления при добавлении или удалении объектов и передает события при изменении объектов.Эти объекты предположительно имели бы три свойства (для указателя даты, поля со списком и текстового поля), которые имеют OnPropertyChanged ().

Затем свяжите ObservableCollection с ItemSource вашей сетки, а три элемента управления с тремя свойствами элемента.

Для MVVM вам никогда не нужно ссылаться на элемент управления в представлении.Вместо этого представление должно отражать состояние ViewModel.Если вы хотите отключить средство выбора даты, его свойство Enabled должно быть связано с чем-то, что вызывает OnPropertyChanged ().

Если вы публикуете свое представление, мы можем предложить, как это сделать.

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