从子视图更新父视图的OnPropertyChanged

时间:2019-11-22 02:13:49

标签: xamarin.forms binding

在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,就像我对其他较小组件所做的那样。 我曾考虑过从子视图中拉出列表,但这引发了非空集合的同样问题。

当然,该代码已被修改为仅显示要点。

谢谢。

0 个答案:

没有答案