我对MVVM不是很了解,在其他网页上读过一些文章。
ViewModel是否完成所有的业务逻辑和与数据模型交互,然后将数据发送到视图进行表示?
在View中,只会有与UI直接相关的函数。
这是我的代码,我有代码,但不确定这是正确的方法
private TestingViewModel Model
{
get
{
return BindingContext as TestingViewModel;
}
}
public TestingPage()
{
InitializeComponent();
BindingContext = new TestingViewModel();
Model.PropertyChanged += TestingPropertyChanged;
NavigationPage.SetHasNavigationBar(this, false);
NavigationPage.SetHasBackButton(this, false);
MediaFactory.ClearAllCachedMedia();
SetupTappedControl();
}
private void TestingPropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName.Equals("ActivePage"))
{
if (Model.ActivePage != null)
{
Device.BeginInvokeOnMainThread(async () =>
{
var path = await MediaFactory.GetImagePathAsync(Model.ActivePage.DocumentId + "_" + Model.ActivePage.PageNumber);
CanvasView.Strokes = Model.ActivePage.Strokes;
CanvasView.LoadBitmapInMemory(path, Model.ActivePage.Width, Model.ActivePage.Height);
});
}
}
}
#region File Button Selected
public void TapFileOpen(object sender, EventArgs e)
{
Task.Run(() =>
{
var pickFileTask = CrossFilePicker.Current.PickFile();
var data = pickFileTask.Result;
Model.OpenDocument(data.FileName, data.DataArray);
});
}
问题1:为什么我要把它传递给一个BindingContext,如果我可以只是持有TestingViewModel对象在后台代码类的视图?
下一行:
CanvasView.Strokes = Model.ActivePage.Strokes;
CanvasView.LoadBitmapInMemory(path, Model.ActivePage.Width, Model.ActivePage.Height);
问题2:Strokes是stroke对象的集合。做中风也是一个ViewModel。
MVVM的思想是在创建视图和业务逻辑之间分离关注点。
ViewModel将管理你的业务逻辑,包括Properties
和Commands
或RelyCommands
的实现,你将稍后绑定到你的视图,所以简单,你不会有任何代码在你的视图在最好的情况下。
为了更好地理解这个模式,我建议你阅读这个msdn链接,它将向你展示如何更好地重构你的代码,以及使用MVVM