2015-10-20 176 views
3

我開始一個新的項目,和id喜歡使用MVVM - 我真的很喜歡這種模式,我一直在我所有的Windows Phone 8.1應用程序中使用它。但轉移到xamarin是一個叢林!我通常使用mvvm light,並且每次創建一個新項目時都會使用一個很好的基本實現 - 但我無法找到一個非常好的示例,顯示我需要的內容。 我想要做的是製作一個Xamarin共享(或便攜)項目,它跨所有平臺共享視圖。我想編寫使用代碼隱藏創建視圖 - 所以沒有XAML。 有沒有人有這方面的經驗,並可以指向我一個很好的示例? 我也想知道是否需要使用第三方框架,因爲導航似乎很容易。視覺工作室xamarin形式mvvm

+0

你爲什麼要這麼做? XAML的主要優點是快速簡單的UI設計和簡單的綁定 – Tseng

+0

我不喜歡XAML。我更喜歡儘可能使用一種語言。恕我直言,長期維護更容易。 – Wosi

回答

1

有很多樣品可以找到。我最喜歡的網站Xamarin.Forms樣本是Xamarin Forms in Anger

讓我們來看看Jobbberr sample

using System; 
using Xamarin.Forms; 

namespace InAnger.Jobbberr 
{ 
    public class SettingsPage : ContentPage 
    { 
     public SettingsPage() 
     { 
      Style = AppStyle.SettingsPageStyle; 

      var pageTitle = new Frame() { 
       Style = AppStyle.PageTitleLabelFrameStyle, 
       Padding = new Thickness(0,Device.OnPlatform(15,0,0),0,10), 
       Content = new Label { 
        Style = AppStyle.PageTitleLabelStyle, 
        Text = "Settings", 
       } 
      }; 

      var signoutButton = new Button() { 
       VerticalOptions = LayoutOptions.EndAndExpand, 
       HorizontalOptions = LayoutOptions.Center, 
       Text = "Sign Out", 
       TextColor = AppStyle.DarkLabelColor, 
      }; 

      Content = new StackLayout { 
       VerticalOptions = LayoutOptions.FillAndExpand, 
       Padding = new Thickness (20), 
       Children = { 
        pageTitle, 
        new BoxView() { 
         HeightRequest = 1, 
         BackgroundColor = AppStyle.DarkLabelColor, 
        }, 
        new SettingsUserView(), 
        new SyncView(), 
        new SettingsSwitchView ("GPS"), 
        new SettingsSwitchView ("Jobs Alert"), 
        signoutButton, 
        new StatusBarView() 
       } 
      }; 
     } 
    } 
} 

你看到了什麼嗎?

新類SettingsPage派生自ContentPage。控件pageTitlesignoutButton在其構造函數中創建。最後,您會看到如何創建StackLayout,並將其填入控件並設置爲頁面內容。這就是如何在代碼中創建Page

如何申請MVVM?

  1. 構造函數的第一行設置BindingContext = ViewModel(創建一個新的視圖模型或通過ViewModelLocator或任何通過找到它)。

  2. 比方說,比如你想的signoutButton向視圖模型的屬性SignOutButtonTextSignoutCommandTextCommand屬性綁定。你會改變這個創建按鈕:

    var signoutButton = new Button() { 
        VerticalOptions = LayoutOptions.EndAndExpand, 
        HorizontalOptions = LayoutOptions.Center, 
        TextColor = AppStyle.DarkLabelColor, 
    }; 
    
    signoutButton.SetBinding(Button.TextProperty, "SignOutButtonText"); 
    signoutButton.SetBinding(Button.CommandProperty, "SignoutCommand"); 
    
+0

感謝您的回答。我並沒有意識到憤怒中的形式:)一直在研究它,並嘗試一些東西 - 這非常好。我的問題是沒有製作一個簡單的MVVM應用程序,但是當涉及瀏覽 - 並在視圖模型之間傳遞參數時 - 它變得複雜。我現在的解決方案是將參數傳遞給視圖,然後在viewmodel上執行我需要的操作,添加數據等等,但是我有點感覺我打破了這裏的模式 - 因爲存在更高的耦合度。通常我會讓視圖實現viewmodels構造函數的導航接口。 – OneBigQuestion