2012-09-07 26 views
2

我为我的地铁应用程序使用MVVM模式。在我的主页上,用户按下按钮,应用程序获取用户的当前位置。处理MVVM中的不同视图模型状态

获取用户位置的过程是异步的,我希望UI发生更改,因此该按钮将被禁用,并且将显示一个不确定的进度栏,直到返回坐标。

根据MVVM来管理这个最好的方法是什么?有一个自定义的视觉状态?我注意到有ApplicationViewStates和CommonStates,是否可以添加自己的自定义的? 你会如何做到这一点?

+0

我不知道你是如何处理的更新进度条的观点,但你无法创建“进度”属性作为可空类型,如果是进展null,显示不确定的进度条并禁用按钮? – AndrewR

+0

当然,但我感兴趣的是人们是否通常会定义一些自定义视觉状态,如“正常”,“发现位置”,然后在故事板之间切换这些状态。或者我想直接绑定到视图模型上的属性并使用价值转换器。例如,布尔可见性。谢谢 – krisdyson

回答

0

我的xaml体验是WPF和Silverlight,但我希望这个建议适用于Metro应用程序。您可以将按钮的IsEnabled属性和进度条的可见性属性绑定到视图模型上的布尔属性(可能称之为IsCurrentLocationComplete)。当异步方法完成并且您的视图将被更新时,您将更改此属性的值。设置按钮的属性很简单,但您需要一个值转换器(IValueConverter)来获取进度条的可见性。

1

我认为你正在寻找的东西,如:

视图模型:

private async void CommandExecution() 
{ 
    IsAwaitingResponse=true; 
    var response = await _myService.DoNetworkCall() 
    IsAwaitingResponse=false; 
} 

如果您正在使用的微软的一个模板,你应该有一个BooleanToVisibilityConverter坐在你的“公共”文件夹中。您可以使用它,像这样:

<Page.Resources> 
    <BooleanToVisibilityConverter x:key="booleanToVisibilityConverter"/> 
</Page.Resources> 
"..." 
<ProgressBar Visibility={Binding IsAwaitingResponse,Converter={StaticResource booleanToVisibilityConverter}}" IsIndeterminate="true"/>