Давайте разберем вашу проблему. Вы хотите посмотреть значение DDSModel.message
и подождать, пока значение не будет иметь значение null
, а затем отреагировать на него, используя Task
.
- Вы хотите, чтобы иметь возможность смотреть значение
DDSModel.message
У
public class DDSModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string property)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private string _message;
public string Message
{
get { return _message; }
set { _message = value; OnPropertyChanged(); }
}
}
Тогда вы можете сделать:
public Task WaitUntilMessageIsNull(model DDSModel)
{
var tcs = new TaskCompletionSource<int>();
PropertyChangedEventHandler handler = (o, e) => {
if(model.Message == null && e.PropertyName == "Message")
{
tcs.SetResult(0);
model.PropertyChanged -= handler;
}
}
model.PropertyChanged += handler;
return tcs.Task;
}
Однако, если вы хотите более чистый код, я бы рекомендовал использовать System.Reactive
для логики.
public Task WaitUntilMessageIsNull(model DDSModel)
{
return Observable
.FromEventPattern<PropertyChangedEventHandler, PropertyChangedEventArgs>(
h => model.propertyChanged += h,
h => model.propertyChanged -= h)
.Where(x => x.EventArgs.PropertyName == "Message")
.Where(_ => model.Message == null)
.ToTask();
}