スキップしてメイン コンテンツに移動

.NET MAUI INotifyPropertyChangedを初めて使った話

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));
    }
}
接続状態のIsConnectとファームウェアのOTA更新の可能かの判定結果のIsCanUpdateを使えるようにした。
   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するのが楽になります。
状況によって痛し痒しって感じですかね。
 
おしまい
 
 
 

コメント

このブログの人気の投稿

RAM DISKを使ってみた(使ったのはImDisk)

GWだし、まあちょっとラムディスクを入れてみました うちのPCはWindows11 使ったのはImDiskというRAM Disk。 まあ、この辺のインストールとかはあちこちで解説してる人がいるので適当にぐぐってくださいな で、とりあえずベンチマーク なかなかいいスピードだ で、大抵の人はブラウザのキャッシュをRAMディスクにするといいよ・・・と言うけど そもそもメインドライブがNVMeのSSDを使っている状態で、体感速度なんか上がらない(使い終わったキャッシュを再起動したら綺麗さっぱり捨て去ってくれるという利点はある)  うちで一番効果があるのは Adobe Audition というアプリ これが結構高速化する(キャッシュをちゃんとRAMディスクにしたら・・・だけど) ハイレゾ音源だと、1時間の音源が何かする度に4GBのファイルを作られてしまう なので、RAM DISKにすると、結構編集時間を短縮できる Premiere Rushも出力先をRam Diskにしておいて終わったら、SSDにコピーすると言う事をやるとかなりスピードアップになる 実はうちのPCは普段は99%のパワーで動作していて、CPUのターボブーストが掛からないようになっている 大体3.6GHz当たりで安定してるのだけど、これを100%にするとターボブースト機能がONになって一部のコアが4.5とか4.8GHzまで上がる まあ、毎回電源オプションをいじる事になるのだけどさ・・・ そうしてベンチを取ると こんな感じ とは言え、ブーストしてるからと行ってRam Diskのスピードの差を体感する事はさすがに無理 ・・・と言うかフォトショでもRAM DISKにしてよかった・・・と言うほど変わらない SSDの性能が上がってきたしもし次にPCを買い換えたらRAM DISKよりSSDの方が速いかもね  

.NET MAUIでスプラッシュスクリーン Android12で地獄を見る

まずは起動するところから・・・・  スプラッシュスクリーンだぬ マイクロソフトのサイト 見てると簡単そう(実際簡単で細かい事を気にしなければsvgファイルを用意して1行だけ書き換えておしまい)   なんかプロジェクトファイルに自動で記述されるらしい よし、プロジェクト作った                     つーか、もうスプラッシュがあるんだけど・・・・ そして自作のsvgファイル くうっ・・・デザインセンスない・・・・   それはともかく、このSVGファイルを Resources\Images にドラッグ&ドラッグ プロジェクトを右クリックして「プロジェクトファイルの編集」 して、編集できるようになったプロジェクトファイルを 自分のプロジェクトファイルに書き換える <MauiSplashScreen Include="Resources\Splash\splash.svg" Color="#512BD4" BaseSize="168,168" /> ↓ <MauiSplashScreen Include="Resources\Splash\ splashtestmaui .svg" Color="#512BD4" BaseSize="168,168" />   とりあえずAndroidで実行 お、おう・・・・ まあ最初はこんなもんよね 最初に紹介したマイクロソフトのサイトでもBaseSizeを書き換えてくださいって言ってるし 言われたとおりに <MauiSplashScreen Include="Resources\Splash\splashtestmaui.svg" Color="#512BD4" BaseSize=" 320,600 " /> 書き換えてみると いい感じじゃーん じゃあアンドロイドのバージョン毎に試してみよう   Android 7 Android 11 Android 12 Android 13 ...

.NET MAUI BLE(Bluetooth Low Energy)も上手く行った

2023/10/11更新 ↓こちらの記事で更新しれました。 .NET MAUI PLUGIN BLEがWindows(10/11)に対応してた Windows対応 イヤッッホォォォオオォオウ Bluetooth LE plugin for Xamarin &amp; MAUI がWindowsに対応してた~ nugetでver3.00をみんな早速ゲットだ。   ちなみにこちらはAndroid版のサンプルアプリ   GitHub...   [ブログカード風リンクタグ作成] ------------------------------------------------------------------------------ 昔、スマホとESP32の接続確認用に作ったプログラムをXamarinからMAUIに移植したら動いちゃった   まあ、ESP32からスマホへの一方通行なアプリなんだけど 面倒くさいので github に公開した 下手くそなコード書きやがってとか思われそう 「間違ってるぞこのやろう」というのを見つけたら教えてくれると嬉しいです 要素技術の調査はこれで完了かな