【发布时间】:2018-05-04 13:06:42
【问题描述】:
当属性更改其值时,我想调用从 Web 服务获取数据的异步方法,然后更新 UI 绑定到的另一个属性,从而导致 UI 更新。更新是异步的对我来说很有意义,因为我希望 UI 在更新进行时保持响应。
从非异步设置器调用异步方法是否错误?我注意到如果异步方法返回 void 则 VS 不会抱怨,但如果它返回 Task 则 Visual Studio 抱怨调用未等待。我的代码如下所示:
public int Property1
{
set
{
_property1 = value;
NotityPropertyChanged();
UpdateData();
}
}
private async void UpdateData()
{
// show data loading message
var data = await GetDataFromWebService();
Property2 = data;
// hide data loading message
}
这似乎有效,但我想知道如果返回类型是任务,我是否没有按照预期的方式使用异步,因为我从 VS 收到警告。
更新:一些答案和 cmets 建议用户使用命令而不是更新以响应属性的变化。对于我的情况,我不确定如何应用它,因此我提供了有关 UI 预期如何工作的更多详细信息。
在用户界面中有日期选择器(绑定到视图模型上的相关属性),用户可以在其中选择他想要查看记录的日期。当用户选择新日期时,应用程序应显示忙碌指示符,然后在后台获取记录以避免阻塞 UI 线程。最好我希望在选择日期时启动更新,而不需要用户在选择日期后按下按钮。
最好将日期选择器的 SelectionChanged 事件绑定到 ViewModel 上的异步命令,或者为 SelectionChanged 设置一个同步处理程序,直接调用视图模型上的更新方法?
【问题讨论】:
-
属性不应该是
async,既不是getter也不是setter。 -
您在此处使用 VM 属性设置器,就好像它是模型操作、命令或按钮单击处理程序一样。 click 应该调用方法或操作,而不是设置属性并期望间接操作。
-
@Panagiotis Kanavos - 我的 UI 需要更新以响应日期字段的更改而不是单击按钮 - 已按问题更新以使这一点更加清晰。您能否建议如何在不启动 setter 更新的情况下适应该场景?一个答案建议收听 PropertyChanged 事件,但由于该事件是从每个属性设置器调用的,我认为这与直接从属性设置器启动更新没有太大区别。
标签: c# wpf task-parallel-library