[英]Accessing Xamarin.Forms inside ViewModel
我是Xamarin.forms中跨平台開發的新手。 我的代碼應該是高度可單元測試的,並且我創建了一個ViewModel
類以在View
和Model
之間進行通信。 我想知道,如果我們要訪問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.