调用属性从方法更改为更新属性



我正在尝试弄清楚如何使用ViewModel更新内的布尔属性INotifyPropertyChanged

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

现在在我的软件生命周期中,列表将得到更新,反过来我想更新每个属性 使用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));
}
}

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

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

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

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

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

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

希望这有帮助吗?

相关内容

  • 没有找到相关文章

最新更新