Вызов PropertyChanged из метода для обновления свойств - PullRequest
0 голосов
/ 07 октября 2019

Я пытаюсь выяснить, как обновить мои свойства bool внутри ViewModel, используя INotifyPropertyChanged?

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

Теперь в моем жизненном цикле программного обеспечения список будет обновляться, и я хочу обновить каждое свойство с помощью INotifyPropertyChanged.

Мой вопрос: как вызвать метод INotifyPropertyChanged из метода AddToList? Является ли использование метода для этого правильное направление?

public class ViewModel : INotifyPropertyChanged
{   
    private List<string> _listOfStrings;

    public ViewModel(List<string> ListOfStrings)
    {   
        _listOfStrings = ListOfStrings;     
    }

    public bool EnableProperty1 => _listOfStrings.Any(x => x == "Test1");
    public bool EnableProperty2 => _listOfStrings.Any(x => x == "Test2");
    public bool EnableProperty3 => _listOfStrings.Any(x => x == "Test3");
    public bool EnableProperty4 => _listOfStrings.Any(x => x == "Test4");

    public void AddToList(string value)
    {
        _listOfStrings.Add(financialProductType);
        // Should I call the OnPropertyChanged here     
    }

    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

Ответы [ 2 ]

1 голос
/ 07 октября 2019

Здесь проще всего было бы вручную вызвать OnPropertyChanged в методе AddString.

public void AddToList(string value)
{
    _listOfStrings.Add(financialProductType);
    OnPropertyChanged("EnableProperty1");
    OnPropertyChanged("EnableProperty2");
    // etc
}

Это хорошо, если вы вряд ли сильно измените класс. Если вы добавите еще одно свойство, которое рассчитывается по _listOfStrings, вам нужно добавить сюда вызов OnPropertyChanged.

Использование ObservableCollection не очень помогает, потому что вы уже знаете, когда меняется список (AddToList) и вам все равно придется запускать все методы OnPropertyChanged.

1 голос
/ 07 октября 2019

Насколько я вижу, в вашей реализации отсутствуют 2 вещи:

  1. Вы должны использовать ObservableCollection вместо List. Как следует из названия, первый может быть observed (уведомлять о его изменении) представлением.
  2. Вам необходимо привязать элемент управления к общедоступной ObservableCollection и вызывать OnPropertyChanged каждый раз, когда вы назначаете / изменяете значениеКоллекция. что-то вроде этого:
private ObservableCollection<string> _myList;
// your control should bind to this property
public ObservableCollection<string> MyList
{
    get => return _myList;
    set
    {
        // assign a new value to the list
        _myList = value;
        // notify view about the change
        OnPropertiyChanged(nameof(MyList));
    }
}


// some logic in your view model
string newValue = "newValue";
_myList.Add(newValue );
OnPropertyCHanged(nameof(MyList));

Надеюсь, это поможет?

...