程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 關於xamarin.forms在MVVM情況下如何DisplayActionSheet,xamarin.formsmvvm

關於xamarin.forms在MVVM情況下如何DisplayActionSheet,xamarin.formsmvvm

編輯:C#入門知識

關於xamarin.forms在MVVM情況下如何DisplayActionSheet,xamarin.formsmvvm


最近一直在研究Xmarin.forms,碰到了一個棘手的問題,就是在MVVM的情況下如何在ViewModel中去使用DisplayActionSheet,然而我使用的是XAML模式,也就是說,只有在後台頁面中,才可以使用Page獨有的DisplayActionSheet。找了一下午資料,網上說,可以給彼此架一座橋梁,使ViewModel和Page連接起來。

首先,你需要在你的Page頁面中,使用MessagingCenter來寫一個DisplayActionSheet的方法

  MessagingCenter.Subscribe<BaseViewModel, DisplayActionSheetModel>(this, "DisplayActionSheet", async (sender, values) =>
            {
                string result = String.Empty;
                result = await DisplayActionSheet(values.Title, values.ButtonOne, values.ButtonTwo, values.DisplayValues);
                if (values.OnCompleted != null)
                {
                    values.OnCompleted(result);
                }
            });
BaseViewModel這個地方當然你寫自己所屬的ViewModel或者Application都可以
在BaseViewModel中我們需要配置下橋梁從而讓我們的ViewModel連接上Page
 public async Task DisplayActionSheet(DisplayActionSheetModel actionSheetModel)
        {
            MessagingCenter.Send<BaseViewModel, DisplayActionSheetModel>(this, "DisplayActionSheet", actionSheetModel);
        }

那麼我們再ViewModel中就可以這樣使用它了

 var actionSheetModel = new DisplayActionSheetModel();
            actionSheetModel.Title = "Are you Sure?";
            actionSheetModel.ButtonOne = "Cancel";
            actionSheetModel.DisplayValues = new string[]
            {
                "Yes","No","I donw't know","I'm sure!","..."
            };
            actionSheetModel.OnCompleted += (accept) =>
            {
                DisData = accept;
            };
            await DisplayActionSheet(actionSheetModel);

使用一個構造類就可以輕松的把數據傳遞給Page了,那麼問題來了

我們現在可以將DisplayActionSheet中所需要的屬性使用ViewModel傳遞給Page,那麼,我們究竟該如何把Page中的數據再拿回來給ViewModel?

想必大家也看到了OnCompleted,那麼大家可以看一下我的Model

 public class DisplayActionSheetModel
    {
        public string Title { get; set; }
        public string ButtonOne { get; set; }
        public string ButtonTwo { get; set; }
        public string[] DisplayValues { get; set; }
        public Action<string> OnCompleted { get; set; }
    }

這樣在你選擇之後它便會把你的所選擇的東西賦值給Action<string>,然後我們使用

OnCompleted += (accept) =>
            {
                DisData = accept;
            };
這樣的方式把選擇的值賦值給DisData接下來看一下效果圖

當然,我是點擊的第二個按鈕之後才會彈出我所選擇的I'm sure

 

 private async Task DisTest()
        {
            await DisplayAlert("Test", DisData);
        }

那麼這樣就會存在一個問題,如果我在選擇之後想要對所選擇的值進行相應的操作怎麼辦?

我試了很多方法,像Task.WaitAll();什麼的,唯一會起到作用的是await Task.Delay(1000);讓接下來的操作等待1秒鐘,如果我選擇的快了,沒有問題,可是如果我選擇的慢了,依舊不行,治標不治本,所以,找了一下午資料也沒有找到合適的解決辦法,請問各位吧友,你們有好的解決辦法嗎?

如果有的話請幫小弟指點一下迷津,小弟感激不盡。。。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved