簡體   English   中英

Xamarin用實際模型形成MVVM

[英]Xamarin Forms MVVM with an actual model

我對Xamarin還是很陌生,偶然發現了MVVM,非常喜歡將其作為一種架構模式。 但是,我發現那里的大多數HowTo和教程僅針對VVM(即View-ViewModel)方面,可能是為了簡單起見!

我想知道如何使用INotifyPropertyChanged范例和其他方法在INotifyPropertyChanged及其關聯模型之間進行通信

如果我理解正確,我個人會把諸如數據處理,數據存儲(集合),數據庫連接之類的東西放入模型中。 至少這是我在過去的MVC美好的日子里一直會做的事情。 我想到以下問題:

  • 我在哪里創建模型,以及如何將它們分配給ViewModels?
  • 如何正確連接 Model和ViewModel,以便傳播屬性更新並正確處理?
  • 您是否會將模型設置為ViewModel的成員?

在我當前的示例中,我想實現一個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.

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