从方法调用 PropertyChanged 以更新属性

Invoking PropertyChanged from a Method to update properties

我想弄清楚如何使用 ViewModel 更新我的 bool 属性 INotifyPropertyChanged?

基本上在我的 ViewModel 中,我传入了一个字符串列表。每个布尔属性检查列表以查看是否 字符串值存在。

现在,在我的软件生命周期中,列表将得到更新,反过来我想更新每个属性 使用 INotifyPropertyChanged。

我的问题是如何从 AddToList 方法调用 INotifyPropertyChanged?正在为此使用一种方法 正确的方向?

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));
    }
}

据我所知,您的实施中缺少两件事:

  1. 您应该使用 ObservableCollection 而不是 List。顾名思义,前者可以通过视图observed(通知其更改)。
  2. 您需要将控件绑定到 public ObservableCollection 并在每次 assign/change 集合值时调用 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));

希望这有帮助吗?

这里最简单的做法是在 AddString 方法中手动调用 OnPropertyChanged

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

如果您不太可能对 class 进行太多更改,这很好。如果您添加另一个根据 _listOfStrings 计算得出的 属性,您需要在此处添加一个 OnPropertyChanged 调用。

使用 ObservableCollection 并没有真正的帮助,因为您已经知道列表何时更改 (AddToList),并且无论如何您仍然必须触发所有 OnPropertyChanged 方法。