本系列文章導航 https://www.cnblogs.com/aierong/p/17300066.html https://github.com/aierong/WpfDemo (自我Demo地址) 0.說明 CommunityToolkit.Mvvm8.1有一個重大更新的功能:源生成器功能,它 ...
0.說明
CommunityToolkit.Mvvm8.1有一個重大更新的功能:源生成器功能,它極大簡化我們的mvvm代碼
但是本篇先總結一下原寫法,下篇再總結源生成器功能
1.模型定義
必須繼承:ObservableObject
2.viewmodel代碼實現
幾個關鍵點:
SetProperty是給屬性賦值,並且通知更改通知
ButtonClickCommand.NotifyCanExecuteChanged(); //通知命令 已經改變
RelayCommand ButtonClickCommand //定義命令
namespace WpfDemoNet6.Demo
{
public class DataViewModel1 : ObservableObject
{
private string title = "hello";
public string Title
{
get
{
return title;
}
set
{
//title = value;
//PropertyChanged?.Invoke( this , new PropertyChangedEventArgs( "Name" ) );
//SetProperty 相當與設置值,並且PropertyChanged通知調用
SetProperty( ref title , value );
}
}
private bool isEnabled = false;
/// <summary>
/// 是否可以使用
/// </summary>
public bool IsEnabled
{
get => isEnabled;
set
{
SetProperty( ref isEnabled , value );
//通知命令 已經改變
ButtonClickCommand.NotifyCanExecuteChanged();
}
}
/// <summary>
/// 命令
/// </summary>
public RelayCommand ButtonClickCommand
{
get;
}
public DataViewModel1 ()
{
//RelayCommand的第一個參數是命令調用語句
// 第2個參數(可選)是否允許使用
ButtonClickCommand = new RelayCommand( () =>
{
//點擊按鈕,修改標題
Title = "hello(改)";
} , () =>
{
return IsEnabled;
} );
ButtonClickCommandPar = new RelayCommand<double>( ( double val ) =>
{
Title = $"hello(改):{val}";
} );
}
public RelayCommand<double> ButtonClickCommandPar
{
get;
}
}
}
3.非同步命令
非同步命令會自動控制控制項的可見性,並且提供一個IsRunning屬性可以判斷非同步是否完成
public DataViewModel1 ()
{
AsyncButtonClickCommand = new AsyncRelayCommand( RunTxtAsync );
AsyncButtonParClickCommand = new AsyncRelayCommand<double>( RunTxtParAsync );
}
/*
特別說明:非同步命令會自動控制控制項的可見性,並且提供一個IsRunning屬性可以判斷非同步是否完成
*/
/// <summary>
/// 命令
/// </summary>
public IAsyncRelayCommand AsyncButtonClickCommand
{
get;
}
private async Task RunTxtAsync ()
{
await Task.Delay( 4800 );
Title = "hello(Task改)";
}
/// <summary>
/// 命令(帶參數的)
/// </summary>
public IAsyncRelayCommand<double> AsyncButtonParClickCommand
{
get;
}
private async Task RunTxtParAsync ( double val )
{
await Task.Delay( 4800 );
Title = $"hello(Task改):{val}";
}
<!--
特別說明:非同步命令會自動控制控制項的可見性,並且提供一個IsRunning屬性可以判斷非同步是否完成
-->
<Button Width="100"
Height="30"
Command="{Binding AsyncButtonClickCommand}"
Content="非同步" />
<TextBlock HorizontalAlignment="Center"
FontSize="20"
FontStyle="Italic"
FontWeight="Bold"
Foreground="Green"
Text="loading......"
Visibility="{Binding AsyncButtonClickCommand.IsRunning, Converter={StaticResource myboolconvert}}" />
我的系列文章
A.Sql Server2005 Transact-SQL 新兵器學習 B.MCAD學習
C.代碼閱讀總結
D.ASP.NET狀態管理
E.DB(資料庫)
F.WAP
G.WinForm
H.Flex
我的好文推薦
FlexAir開源版-全球免費多人視頻聊天室,免費網路遠程多人視頻會議系統((Flex,Fms3聯合開發))<視頻聊天,會議開發實例8>
Sql Server2005 Transact-SQL 新兵器學習總結之-總結
MS SQL資料庫備份和恢復存儲過程(加強版本)
sql server中分散式查詢隨筆(鏈接伺服器(sp_addlinkedserver)和遠程登錄映射(sp_addlinkedsrvlogin)使用小總結)
ASP.NET2.0國際化/本地化應用程式的實現總結(多語言,多文化頁面的實現)
WAP開發資料站(最新更新)
自定義格式字元串隨筆 (IFormattable,IFormatProvider,ICustomFormatter三介面的實現)
Mcad學習筆記之非同步編程(AsyncCallback 委托,IAsyncResult介面,BeginInvoke方法,EndInvoke方法的使用小總結)
Mcad學習筆記之通過反射調用類的方法,屬性,欄位,索引器(2種方法)
Mcad學習筆記之序列化(2進位和Soap序列 化)
Mcad學習筆記之委托再理解(delegate的構造器,BeginInvoke,EndInvoke,Invoke4個方法的探討)
ASP.NET狀態管理之一(概括篇)
Flex,Fms學習筆記
希望上面提到的知識對您有所提示,同時歡迎交流和指正
作者:aierong
出處:http://www.cnblogs.com/aierong
貼子以"現狀"提供且沒有任何擔保,同時也沒有授予任何權利!
本文版權歸作者所有,歡迎轉載!
原創技術文章和心得,轉載註明出處!這也是對原創者的尊重!