[英]Xamarin Forms MVVM with an actual model
我對Xamarin還是很陌生,偶然發現了MVVM,非常喜歡將其作為一種架構模式。 但是,我發現那里的大多數HowTo和教程僅針對VVM(即View-ViewModel)方面,可能是為了簡單起見!
我想知道如何使用INotifyPropertyChanged
范例和其他方法在INotifyPropertyChanged
及其關聯模型之間進行通信 。
如果我理解正確,我個人會把諸如數據處理,數據存儲(集合),數據庫連接之類的東西放入模型中。 至少這是我在過去的MVC美好的日子里一直會做的事情。 我想到以下問題:
在我當前的示例中,我想實現一個SensorModel
,該模型提供上面層可以訂閱的幾個感官數據。 每當新的傳感器數據可用於以上各層時,我都希望發送更新。 例如,一個ViewModel。
我基本上已經想到了這樣的事情:
class Sensor
{
int _id { get; set; }
string _name { get; set; }
}
class SensorModel
{
private List<Sensor> _sensors { get; set; }
public void addSensor(Sensor s) ...
public void removeSensor(Sensor s) ...
}
是否有人鏈接到實際/完整的MVVM示例, 包括 Model和ViewModel之間的連接?
任何幫助表示贊賞。
使用最新的穩定Xamarin表格
楷模
在項目中,創建一個“ 模型”文件夾
為了存儲數據,我通常使用SQLite或臨時存儲:
class DataStore
{
public static List<SensorModel> SensorStore { get; set; }
}
創建SensorModel模型
class SensorModel
{
internal int Id { get; set; }
internal string Sensor { get; set; }
}
視圖模型
在項目中,創建一個ViewModels文件夾
創建一個SensorVM視圖模型
class SensorVM : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public System.Windows.Input.ICommand StartCommand { get; set; }
public string SensorName { get; set; }
public SensorVM()
{
DataStore.SensorStore = new List<SensorModel>();
StartCommand = new Xamarin.Forms.Command(StartSubmit);
}
private void StartSubmit(object paramter)
{
var sensor = new SensorModel()
{
Id = 1,
Sensor = SensorName
};
AddSensor(sensor);
}
public void AddSensor(SensorModel sensor)
{
//do something
DataStore.SensorStore.Add(sensor);
}
}
意見
在項目中,創建一個“ 視圖”文件夾
創建一個Sensor.xaml視圖
<ContentPage.Content>
<StackLayout Spacing="10" Orientation="Vertical">
<Entry Text="{Binding SensorName}" />
<Button Command="{Binding StartCommand}" Text="Start" />
</StackLayout>
</ContentPage.Content>
在后面的代碼中:
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class Sensor : ContentPage
{
SensorVM vm;
public Sensor()
{
InitializeComponent();
BindingContext = vm = new SensorVM();
}
}
希望能有所幫助。
我想知道如何使用INotifyPropertyChanged范例和其他方法在ModelView及其關聯模型之間進行通信。
我認為在MVVM中創建通信的最佳方法是Messaging Center。 https://docs.microsoft.com/pt-br/xamarin/xamarin-forms/app-fundamentals/messaging-center
它沒有從設備(傳感器)代碼耦合到查看模型...
在此模型中,您的消息會激活一些活動事件,這些事件可能會訪問您的視圖模型以及其他結構。
一個樣本
在您看來,請使用:
public void MessegingCenterInit()
{
#region Bluetooth
MessagingCenter.Subscribe<string, string>("App", "Status_name", (sender, arg) =>
{
App.PVM.Name = $"{arg}";//using INotifyPropertyChanged and view model
viewmodelMethod();//using only a viewmodel
});
#endregion
}
在您的模型中使用:
public string Name
{
get { return name; }
set
{
name = value;
App.PVM.Add_patient.AddCanExecuteChanged();//PVM is a viewmodel
//The view model need to have INotifyPropertyChanged as a interface
}
}
在特定的代碼中(具有通用方法或事件):
string new_name = John;
MessagingCenter.Send<string,string>("App","Status_name",new_name);
有幾種方法可以做到這一點,它很簡單,您可以嘗試使用對象作為發送者,而信息卻較少。
問候
在幾乎所有情況下,Model和ViewModel之間都沒有通信,而Model和View之間卻很少有通信。 如果您需要在Model和ViewModel之間進行通信,則很可能您做錯了什么。
解釋一下,您的模型通常描述一些實體,例如您擁有Cat類:
public class Cat
{
public string Color {get; set;}
}
通常在ViewModel中將其用作字段或Collection,例如:
public class CatsViewModel
{
public List<Cat> Cats {get; set;}
}
貓不能自行更新,如果更新,則可以通過與視圖的綁定或從ViewModel的某處完成。
我認為您的應用程序中存在一些架構問題。
Xamarin本身使用默認的Master-Detail解決方案提供了一個很好的例子。
只需創建一個新的Xamarin.Forms應用程序並選擇“主從布局”即可。 它包括幾個視圖,一個ViewModels(帶有BaseVIewModel)和一些MockUp數據類。 首先,看看那里:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.