INotifyPropertyChangedとは
プロパティ値が変更されたときに通知するものらしい。
だったら普通にイベント作れば良いじゃん?とはならないらしい
実際の値が変更したことに対し、参照元がアクションする?的な感じ
それを画面表示の自動更新のネタ元にするために使ってみました。
クラスを作ろう
何はともあれクラスを作る。今あるBLEのクラスの継承元にINotifyPropertyChangedインターフェースを指定しても良かったんだけど、何かしら画面更新のイベントを集めたかったので別クラスを作った
今回はBLEControlViewModelsというクラスを作成。継承元をINotifyPropertyChanged。
public class BLEControlViewModels : INotifyPropertyChanged
{
/// <summary>アップデートが可能か true=アップデート可能なファーム false=アップデート不可能</summary>
private bool _isCanUpdate;
/// <summary>接続状態</summary>
private bool _isConnect;
/// <summary>
/// アップデートが可能か true=アップデート可能なファーム false=アップデート不可能
/// </summary>
public bool IsCanUpdate
{
get => _isCanUpdate;
set
{
if (_isCanUpdate != value)
{
_isCanUpdate = value;
OnPropertyChanged();
}
}
}
/// <summary>
/// 接続状態
/// </summary>
public bool IsConnect
{
get => _isConnect;
set
{
if (_isConnect != value)
{
_isConnect = value;
OnPropertyChanged();
}
}
}
/// <summary>
/// コンストラクタ
/// </summary>
public BLEControlViewModels()
{
// 初期値を設定
IsCanUpdate = false;
var bleControl = App._bleCtrl;
// ファームウェアのアップデートが可能かの通知を受け取る
bleControl.OnUpdateStatusChanged += (sender, e) =>
{
if(e.status == CAN_UPDATE_STATUS.UPDATEOK)
{
IsCanUpdate = true;
}
else
{
IsCanUpdate = false;
}
};
// BLE接続可能かの通知を受け取る
bleControl.OnConnect += (sender, e) =>
{
IsConnect = true;
};
// BLE接続不可かの通知を受け取る
bleControl.OnDisConnect += (sender, e) =>
{
IsConnect = false;
};
}
/// <summary>
/// プロパティ変更通知
/// </summary>
public event PropertyChangedEventHandler PropertyChanged;
/// <summary>
/// プロパティ変更通知
/// </summary>
/// <param name="propertyName"></param>
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
var bleControl = App._bleCtrl;
は私の作ってるアプリにしか無いので皆さんは自分の使いたいクラスを使ってください。当然そこから生えているイベントも私のアプリにしかありません。
画面のソース(.cs側)
画面に追加したいのでそのソースの.cs側に usingで先ほどのクラスを設定(namespaceの付け方次第では無しでもいける)し、さっき作ったクラスを変数宣言。
そしてコンストラクタ内で初期化し、BindingContextプロパティに代入
using BLEControl.ViewModels;
public partial class SettingMainPage : ContentPage
{
private BLEControlViewModels viewModel; // ★変数宣言
/// <summary>
/// コンストラクタ
/// </summary>
public SettingMainPage()
{
InitializeComponent();
viewModel = new BLEControlViewModels(); //★初期化 private宣言したときにやってしまってもいい
BindingContext = viewModel;// ★バインド
}
}
画面のソース(.xaml側)
そして、xaml側ではさっき作ったBLEControlViewModels のうちのIsConnectをBindしてみる。
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="LEderMaui.Views.Setting.SettingMainPage">
<!-- 設定メイン -->
<ContentPage.Content>
<StackLayout>
<Button Text="ファームウェアアップデート"
x:Name="btnFirmUp"
Clicked="btnFirmUp_Clicked"
IsEnabled="{Binding IsConnect}" />
</StackLayout>
</ContentPage.Content>
</ContentPage
正直言って使うのが1箇所か2箇所なら面倒くさすぎて使う意味は無いと思います。ただ、1回作ってしまえばBindするのが楽になります。
状況によって痛し痒しって感じですかね。
おしまい
コメント
コメントを投稿