2012-09-07 65 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"/>