在Mac版Xamarin中,我决定使用MVVM模式在主视图中使用多个视图。
问题是,我的MainPage中有一个ListView,该ListView从模型中提取项目列表,并且该列表填充在具有自己的ViewModel的子视图中。
当我从子视图中添加新服务时,我希望触发父视图模型上的OnPropertyChanged事件。
可以通过导航到父视图并将动画设置为false来工作,但这看起来并不好。但是,当我将所有代码包含在一个ViewModel中时,它就可以工作。
我如何实现这一目标以及出现的错误:
0-从父模型访问子模型中的命令,并传递属性已更改的事件处理程序。
我做不到。我通过执行如下所示的可绑定命令来尝试此操作,但这对我而言是不可行的,因为我认为该命令不可能知道何时更改属性,这是解决此问题的全部要点。 如果可行,我不知道怎么做。
//public static readonly BindableProperty SaveServiceClickedCommandProperty =
// BindableProperty.Create(
// "SaveServiceClicked",
// typeof(Command),
// typeof(NewServiceViewModel),
// null);
1-在子视图模型上传递父视图模型,并在单击的事件处理程序上放置OnPropertyChanged(nameof(parentModel.List))。
public class ChildViewModel : INotifyPropertyChanged
{
public ICommand AddEntryClickedCommand { get; private set; }
private MainModel mainModel;
// property changed handler
public event PropertyChangedEventHandler PropertyChanged;
void OnPropertyChanged(string name)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
public NewServiceViewModel()
{
Navigation = MainPage;
//async void execute() => await OpenPage();
//OpenPageCommand = new Command(execute, () => !IsBusy);
//async Task OpenPage()
//{
// await Navigation.PushAsync(new MainPage());
//}
// Here I tried to access the data from within the main model.
mainModel = new MainModel(Navigation);
InitMainModel();
void InitMainModel()
{
MainPage mainView = new MainPage();
mainView.BindingContext = mainModel;
}
async void c1() => await AddEntryClicked();
AddEntryClickedCommand = new Command(c1);
}
public async Task<bool> AddEntryClicked()
{
OnPropertyChanged(nameof(mainModel.List))
}
由于该对象已被填充,因此上述尝试产生了一些错误。 导致我认为我完全没有正确的方法。
我的解决方案是在父视图中重新引入子视图,并根据是否单击按钮来更改IsVisible,就像我对其他较小组件所做的那样。 我曾考虑过从子视图中拉出列表,但这引发了非空集合的同样问题。
当然,该代码已被修改为仅显示要点。
谢谢。