簡體   English   中英

在ViewModel中訪問Xamarin.Forms

[英]Accessing Xamarin.Forms inside ViewModel

我是Xamarin.forms中跨平台開發的新手。 我的代碼應該是高度可單元測試的,並且我創建了一個ViewModel類以在ViewModel之間進行通信。 我想知道,如果我們要訪問viewmodel內部的Xamarin.forms(使用Xamarin.Forms;),是一種不好的做法還是違反了MVVM概念。 如果是這樣,我們如何在ViewModel中使用Command與視圖綁定。

謝謝

從視圖模型訪問視圖確實是“反對” MVVM原理的。 所以,您說對了! 但是,綁定Command並不難,並且可以像您使用過的其他綁定一樣工作。

在視圖模型中,只需為Command定義一個屬性:

public class YourViewModel
{
    public Command YourCommand { get; set; }
}

然后在構造函數中定義應執行的邏輯:

public YourViewModel()
{
    YourCommand = new Command(() =>
    {
        Console.WriteLine("TADA!");
    });
}

當然,您可以定義它是它自己的單獨方法或以其他方式聲明它。 為簡潔起見,我現在已內聯完成。

要從XAML綁定到它,只需執行以下操作:

<Button Text="Make it so!" Command="{Binding YourCommand}" />

並確保已將頁面上的BindingContext屬性設置為視圖模型。 如果您使用的是MVVM框架,則可能已經這樣做了。

在某個時候,您可能想綁定到ListView或類似的單元格。 在這種情況下,請記住范圍會發生變化。 然后,您將綁定到該單元而不是頁面后面的視圖模型。 因此,您必須對頁面進行引用才能到達該BindingContext 但是,當您到達那座橋時,請記住,那里有一些特別之處。

使用以下代碼,因此您無需在ViewModel中導入Xamarin.Forms:

按鈕行為

 public class ButtonBehavior : Behavior<Button>
    {
        protected override void OnAttachedTo(Button bindable)
        {
            base.OnAttachedTo(bindable);
            bindable.Clicked += Bindable_Clicked;
        }

        private void Bindable_Clicked(object sender, EventArgs e)
        {
            //Use you logic here
        }

        protected override void OnDetachingFrom(Button bindable)
        {
            base.OnDetachingFrom(bindable);
            bindable.Clicked -= Bindable_Clicked;
        }
    }

視圖

    <Button Text="Click Me" HeightRequest="50" WidthRequest="80">
        <Button.Behaviors>
            <behavior:ButtonBehavior/>
        </Button.Behaviors>
    </Button>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM