Dev中的MVVM

Dev中的MVVM实现

参考博客

https://www.cnblogs.com/lovexinyi/p/11980398.html
https://blog.csdn.net/hbwhypw/article/details/108804523

代码示例

public class View:UserControl
{
	MVVMContext mvvmContext;
	public View()
	{
		InitializeComponet();
		InitialBinding();
	}
	public void InitialBinding()
	{
		MVVMContextFluentAPI<Model> fluentAPI = mvvmContext.OfType<Model>();
		//绑定属性
		fluentAPI.SetBinding(textEdit1,x=>x.Text,y=>Text);
		fluentAPI.SetBinding(dataGrid1,x=>x.DataSource,y=>DataLis);
		fluentAPI.SetBinding(series1,x=>x.DataSource,y=>DataLis);
		//绑定命令(默认命令,一般指按钮)
		//命令默认是不带参数或带一个参数的虚方法
		fluentAPI.BindCommand(simpleButton1,x=>x.Click);
		string paramter="Hello World";
		fluentAPI.BindCommand(simpleButton2,(x,p)=>x.ClickParam(p),x=>paramter);
		//绑定任意命令(可以是控件的任一事件)
		//形式:fluentAPI.WithEvent<原事件的入参,如果没有不填>(控件,控件的事件名).EventToCommand(x=>x.ViewModel中的方法)
		fluentAPI.WithEvent<FocusedRowChangedEventArgs>(gridView1, "FocusedRowChanged").EventToCommand(x => x.GetRowHandle);
		//还有内容未写
		//触发器
		//当Model中的虚属性发生变化,会在View中触发
		flentAPI.SetTrigger(x=>x.DataLis,d=>{
			textEdit.Text=d.Count;
		});
		//通信
		//注册通知
		Messenger.Default.Register<string>(this,ShowCount);
		//服务
		
		//行为
	}
	private void ShowCount()
	{
		Console.WriteLine(message);
	}
}
//无需继承INotif
public class Model
{
	//如果不加virtual那么只有View——>ViewModel的刷新
	//加virtualView<——>ViewModel
	public virtual string Text {get;set;}
	//可以通过特性指定属性修改后触发的方法
	//在Dev中对于集合元素只有集合的Count发生变化才视为属性变化
	[BindableProperty(OnPropertyChangedMethodName="ShowLisCount")]
	public virtual BindingList<Data> DataLis {get;set;}=new BindingList<Data>();
	public virtual void Click(){ }
	public virtual void ClickParam(string param){}
	//属性更改该方法自动触发(属性前面必须要加virtual)
	public virtual void OnTextChanged(){}
	public virtual void ShowLisCount()
	{
		//一种简单的在类之间传值的方法
		//实现了全局的观察者模式(发布订阅的通信方式)
		Messenger.Default.Send(DataLis.Count);
	}
	//实现线程间通信的功能
	IDispatcherService Dispatcher
	{
		get { return this.GetService<IDispatcherService>(); }
	}
	private async Task AsyncChangeText()
	{
		//InvalidOperationException: 线程间操作无效: 从不是创建控件“textEdit3”的线程访问它。
		await Task.Run(() => { Text = "666";  });
		await Task.Run(() => { Dispatcher.BeginInvoke(() => { Text = "666"; }); });
	}
}
posted @ 2023-07-03 13:57  回首起了风沙  Views(20)  Comments(0)    收藏  举报