繁体   English   中英

从子视图更新父视图上的 OnPropertyChanged

[英]Update OnPropertyChanged on a Parent View from a child view

在 Xamarin for mac 中,我决定使用 MVVM 模式在我的主视图中创建多个视图。

问题是我的 MainPage 中有一个 ListView,它从 model 中提取项目列表,并且该列表填充在具有自己的 ViewModel 的子视图中。

当我从子视图添加新服务时,我希望触发父视图 model 上的 OnPropertyChanged 事件。

它通过导航到父视图并将 animation 设置为 false 来工作,但这看起来不太好看。 当我在一个 ViewModel 中拥有所有代码时,它仍然有效。

我是如何尝试实现这一目标的,以及我得到的错误:

0 - 从父 model 访问子 model 中的命令,并传递 propertychanged 事件处理程序。

我做不到。 我通过制作如下所示的可绑定命令来尝试此操作,但这对我来说是不可行的,因为我认为该命令不可能知道何时更改属性,这就是这个问题的重点。 如果可行,我不知道如何。

        //public static readonly BindableProperty SaveServiceClickedCommandProperty =
    //    BindableProperty.Create(
    //        "SaveServiceClicked",
    //        typeof(Command),
    //        typeof(NewServiceViewModel),
    //        null);

1 - 在子视图 model 上传递父视图 model,并在单击的事件处理程序处放置一个 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))
    }

上述尝试产生了一些错误,因为 object 已被填充。 导致我认为我完全没有正确的方法。

我的解决方案是在父视图中重新引入子视图,并根据是否单击按钮更改 IsVisible,就像我已经对其他较小的组件所做的那样。 我曾考虑从子视图中拉出列表,但这引发了同样的非空集合问题。

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

提前致谢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM