Я только начал заниматься MVVM, потому что слышал о его преимуществах:
- Чистый код
- Код многократного использования
- Лучший код организован
Итак, начал делать обычный «Код позади», чтобы убедиться, что мой код работает, а затем применить MVVM для его очистки. так вот один из моих примеров «кода позади»:
private const int LED_PIN = 17, RELAY_PIN = 27;
private GpioPin LEDpin, RELAYpin;
private bool InitGPIO(TextBlock txt)
{
var gpio = GpioController.GetDefault();
// Show an error if there is no GPIO controller
if (gpio == null)
{
txt.Text = "There is no GPIO controller on this device.";
txt.Foreground = new SolidColorBrush(Colors.Red);
return false;
}
txt.Text = "GPIO controller initialized correctly.";
txt.Foreground = new SolidColorBrush(Colors.Green);
LEDpin = gpio.OpenPin(LED_PIN);
RELAYpin = gpio.OpenPin(RELAY_PIN);
LEDpinValue = GpioPinValue.Low;
RELAYpinValue = GpioPinValue.High;
LEDpin.Write(LEDpinValue);
RELAYpin.Write(RELAYpinValue);
LEDpin.SetDriveMode(GpioPinDriveMode.Output);
RELAYpin.SetDriveMode(GpioPinDriveMode.Output);
return true;
}
Чтобы использовать этот метод «InitGPIO», я должен предоставить:
- фиксированный «int» вывод.
- Типы GpioPin.
- Тип GpioPinValue.
- Текстовый блок для отображения того, что не так.
Я уже создал ViewModelBase и метод упрощения, чтобы получитьон читал:
public class ViewModelBase
{
public InitGpioCommand InitGpiocommand { get; set; }
public ViewModelBase()
{
this.InitGpiocommand = new InitGpioCommand(this);
}
public bool InitGPIO(DigitalControl dc)
{
var gpio = GpioController.GetDefault();
// Show an error if there is no GPIO controller
if (gpio == null)
{
dc.Status.Text = "There is no GPIO controller on this device.";
dc.Status.Foreground = new SolidColorBrush(Colors.Red);
return false;
}
dc.Status.Text = "GPIO controller initialized correctly.";
dc.Status.Foreground = new SolidColorBrush(Colors.Green);
dc.DevicePin = gpio.OpenPin(dc.PinNumber);
dc.PinValue = GpioPinValue.Low;
dc.DevicePin.Write(dc.PinValue);
dc.DevicePin.SetDriveMode(GpioPinDriveMode.Output);
return true;
}
}
все было обернуто в этой модели:
public class DigitalControl
{
public TextBlock Status { get; set; }
public GpioPin DevicePin { get; set; }
public GpioPinValue PinValue { get; set; }
public int PinNumber { get; set; }
}
и моя текущая кнопка для запуска метода InitGPIO:
<Button x:Name="FirstLightTest"
Content="Test"
Command="{Binding InitGPIO,Source={StaticResource viewmodel}}">
</Button>
OfКонечно, это не сработает.
Я понимаю, что должен:
- Передать "TextBlock" из xaml в параметр метода в ViewModelBase.
- Назначить GpioPin,GpioPinValue и PinNumber где-то в коде C #, а также передают их в метод внутри ViewModelBase.
Для того, чтобы заполнить все параметры в этом методе. Я действительно не знаю, плохой ли это дизайн MVVM или нет, но я думаю, что лучше всего использовать этот сложный шаблон, чтобы разбить его на мелкие проблемы, подобные этой, и посмотреть, насколько он ценен.