Я прошу прощения за этот длинный вопрос, но я надеюсь, что вы можете остаться со мной.Я пытался сделать все возможное, чтобы включить все соответствующие фрагменты кода, чтобы точно объяснить, чего я хочу достичь.
Я пытаюсь преобразовать свое мобильное приложение в шаблон проектирования MVVM, и я испытываю немногосложность с обновлением моего представления с учетом изменений, произошедших в моей модели.
Я разделил свое приложение на классическую структуру модель, вид, вид модель.
В настоящее время я пытаюсь распространить данные из моей модели SoundScapeData.cs
в мое представление HomePage.xaml
.
Мой HomePage.xaml
файл с выделенным кодом выглядит следующим образом:
namespace AX2018
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class HomePage : ContentPage
{
public HomePage()
{
InitializeComponent();
BindingContext = new HomePageViewModel();
}
private void OnConnectButtonClicked(object sender, EventArgs e)
{
Bluetooth bluetooth = new Bluetooth();
bluetooth.Connect();
}
}
}
Как видите, я связываю свои данные с помощью ключевого слова BindingContext
и привязываю их к новому экземплярукласс HomePageViewModel
.
Я подключаюсь к устройству Bluetooth, поэтому выполняется вызов bluetooth.Connect()
, который вызывается при нажатии Button
в представлении HomePage.xaml
.Это устройство Bluetooth затем обновляет приложение с определенными значениями.
Хочу подчеркнуть, что соединение Bluetooth работает хорошо, и было проверено, что он работает с View до для преобразования в шаблон проектирования MVVM.
My ViewModel, HomePageViewModel.cs
, выглядит следующим образом:
namespace AX2018
{
public class HomePageViewModel
{
private SoundScapeData _soundScapeData;
public SoundScapeData SoundScapedata { get { return _soundScapeData; } }
public HomePageViewModel()
{
_soundScapeData = new SoundScapeData();
}
}
}
Кстати, я немного запутался, как проектировать модель представления, поскольку модель SoundScapeData.cs
в настоящее время так проста, как есть.Является ли этот посредник View Model даже необходимым?
Это моя SoundScapeData.cs
модель:
namespace AX2018
{
public class SoundScapeData : INotifyPropertyChanged
{
private double _spl;
public double SPL
{
get { return _spl; }
set
{
_spl = value;
OnPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged([CallerMemberName] string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
Как вы можете видеть из модели, она реализует интерфейс INotifyPropertyChanged
и имеетсоответствующая функция для обработки события в методе OnPropertyChanged()
.
My View, HomePage.xaml
, довольно длинная - она состоит из сетки 9 x 3 с метками, размещенными в определенных положениях.Эти метки должны отражать значения в SoundScapeData.cs
модели (и других моделях, но это в будущем).Вот соответствующие фрагменты:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:AX2018"
x:Class="AX2018.HomePage">
<ContentPage.BindingContext>
<local:HomePageViewModel/>
</ContentPage.BindingContext>
...
<Label Text="{Binding SoundScapedata.SPL}"
FontSize="68" Style="{StaticResource ColoredLabel}"
Grid.Row="4"
Grid.Column="1"
Margin="-20"></Label>
Как вы можете видеть, я связал данные в представлении HomePage.xaml
с моделью представления HomePageViewModel.cs
, которая содержит экземпляр модели SoundScapeData.cs
,который в свою очередь реализует интерфейс INotifyPropertyChanged
.
Насколько я понимаю, это правильный подход с точки зрения привязки данных при использовании шаблона проектирования MVVM.Тем не менее, изменения в SPL не отражены в моем представлении HomePage.xaml
.
Я обновляю значение SPL в отдельном классе Bluetooth.cs
, который наследуется от модели SoundScapeData.cs
.Вот фрагмент из Connect()
метода из Bluetooth
класса:
namespace AX2018
{
public async void Connect()
{
public class Bluetooth : SoundScapeData
...
var dbValue = (double)BitConverter.ToUInt16(temp1, 0) / 256 * 48;
SPL = dbValue;
...
}
}
Снова, я прошу прощения за этот довольно длинный вопрос, но я надеюсь, что кто-то там может указать мне, что я делаюнеправильно.Я хочу повторить, что значение SPL обновилось в View до до преобразования в MVVM, поэтому я определенно делаю что-то не так с моей привязкой данных.
Заранее спасибо,
kdhansen