gpt4 book ai didi

c# - 使用 MVVM 对 ComboBox 选择的异步方法调用

转载 作者:行者123 更新时间:2023-11-30 12:39:26 24 4
gpt4 key购买 nike

我在显示通过 ComboBox 选择过滤的图表时遇到了问题,而没有锁定 UI。统计过滤非常繁重,需要运行 async。在我尝试从 Property setter 调用 FilterStatisticsAsyncMonthSelectionChanged 之前,一切正常。有没有人对如何解决或解决这个问题有好的建议?

XAML 如下所示:

        <ComboBox x:Name="cmbMonth"
ItemsSource="{Binding Months}"
SelectedItem="{Binding SelectedMonth }"
IsEditable="True"
IsReadOnly="True"

像这样的 ViewModel 属性 setter :

    public string SelectedMonth
{
get { return _selectedMonth; }
set { SetProperty(ref _selectedMonth, value); LoadStatisticsAsync(); MonthSelectionChanged(); }
}

SetProperty 派生自封装 INPC 的基类,如下所示:

        public event PropertyChangedEventHandler PropertyChanged = delegate { };

protected virtual void SetProperty<T>(ref T member, T value, [CallerMemberName] string propertyName = null)
{
if (Equals(member, value))
return;

member = value;
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}

最佳答案

我会用这个来做:

    public class AsyncProperty<T> : INotifyPropertyChanged
{
public async Task UpdateAsync(Task<T> updateAction)
{
LastException = null;
IsUpdating = true;

try
{
Value = await updateAction.ConfigureAwait(false);
}
catch (Exception e)
{
LastException = e;
Value = default(T);
}

IsUpdating = false;
}

private T _value;

public T Value
{
get { return _value; }
set
{
if (Equals(value, _value)) return;
_value = value;
OnPropertyChanged();
}
}

private bool _isUpdating;

public bool IsUpdating
{
get { return _isUpdating; }
set
{
if (value == _isUpdating) return;
_isUpdating = value;
OnPropertyChanged();
}
}

private Exception _lastException;

public Exception LastException
{
get { return _lastException; }
set
{
if (Equals(value, _lastException)) return;
_lastException = value;
OnPropertyChanged();
}
}

public event PropertyChangedEventHandler PropertyChanged;

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

属性的定义

 public AsyncProperty<string> SelectedMonth { get; } = new AsyncProperty<string>();

代码中的其他地方:

SelectedMonth.UpdateAsync(Task.Run(() => whateveryourbackground work is));

在 xaml 中绑定(bind):

SelectedItem="{Binding SelectedMonth.Value }"

请注意,属性应该反射(reflect)当前状态,而不是触发可能需要无限长时间的过程。因此需要以不同于仅仅分配它的方式更新属性。

关于c# - 使用 MVVM 对 ComboBox 选择的异步方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45572342/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com