Xamarin.forms 从子视图更新父视图上的OnPropertyChanged

Xamarin.forms 从子视图更新父视图上的OnPropertyChanged,xamarin.forms,binding,Xamarin.forms,Binding,在XamarinforMac中,我决定使用MVVM模式在主视图中使用多个视图 问题是,我的主页中有一个ListView,它从模型中提取一个项目列表,该列表在子视图中填充,并具有自己的ViewModel 从子视图添加新服务时,我希望父视图模型上的OnPropertyChanged事件触发 它是通过导航到父视图并将动画设置为false来工作的,但这并不是很好看。不过,当我将所有代码都放在一个ViewModel中时,它就工作了 我是如何做到这一点的,以及我所犯的错误: 0-从父模型访问子模型内的命令,

在XamarinforMac中,我决定使用MVVM模式在主视图中使用多个视图

问题是,我的主页中有一个ListView,它从模型中提取一个项目列表,该列表在子视图中填充,并具有自己的ViewModel

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

它是通过导航到父视图并将动画设置为false来工作的,但这并不是很好看。不过,当我将所有代码都放在一个ViewModel中时,它就工作了

我是如何做到这一点的,以及我所犯的错误:

0-从父模型访问子模型内的命令,并传递propertychanged事件处理程序

我做不到。我通过如下所示的可绑定命令尝试了这一点,但这对我来说是不可行的,因为我认为命令不可能知道何时更改属性,这就是问题的关键所在。 如果可行,我不知道怎么做

        //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))
    }
公共类ChildViewModel:INotifyPropertyChanged
{
public ICommand AddEntryClickedCommand{get;private set;}
私有主模型主模型;
//属性更改处理程序
公共事件属性更改事件处理程序属性更改;
void OnPropertyChanged(字符串名称)
{
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(名称));
}
公共新闻服务视图模型()
{
导航=主页;
//异步void execute()=>等待OpenPage();
//OpenPageCommand=新命令(执行,()=>!IsBusy);
//异步任务OpenPage()
//{
//等待Navigation.PushAsync(新主页());
//}
//在这里,我试图从主模型中访问数据。
mainModel=新的mainModel(导航);
InitMainModel();
void InitMainModel()
{
MainPage mainView=新建MainPage();
mainView.BindingContext=mainModel;
}
异步void c1()=>等待AddEntryClicked();
AddEntryClickedCommand=新命令(c1);
}
公共异步任务AddEntryClicked()
{
OnPropertyChanged(名称(mainModel.List))
}
上面的尝试创建了一些错误,因为对象已填充。 导致我认为我没有完全正确的方法

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

当然,代码已经修改为只显示要点


提前感谢。

您有两个视图(主页和子页面),有自己的viewmodels,但是属性是相同的?你能在这里发布你的布局xaml吗?如果你想更新模型和视图,当它们都更改时,你可以在
命令中添加
Mode=TwoWay
。嗨。已经这样做了,并删除它以重新添加。但是什么都没有。我将删除此视图并将其包含在mai中在我看来,整个问题在于,从另一个ViewModel调用变量会实例化另一个包含相同数据的变量,从而在代码中产生冲突。无论如何,这不是一个问题,因为视图很小,但最好将父视图和子视图分开使用MVVM模式,让属性处理程序可以在任何地方共享。我是一个C#noob,所以肯定是我的错…你解决了这个问题吗?嗨,Leon。在我看来,这是不可解决的。我将代码放回主视图模型,并从主视图与之交互,就像我之前将ContentView分离一样。我仍然在ma下使用视图例如,在标题页面中。我很想学习一个新技巧,将多个ContentView保存在一个ContentPage下,并能够轻松地在ViewModels之间共享详细信息。我假设我打破了MVVM惯例。再次感谢。此外,由于我无法编辑上面的答案以提供更多详细信息,以下视频是,在我的oPinne,ContentPages中多个ContentView的最佳资源:我个人喜欢他提到的一个事实,即变量在初始化时需要保持为null。这样可以确认变量在视图下的两个模型中都已初始化。开发人员需要注意这一点,因为不知道您所做的事情可能导致错误到一个堆栈溢出。再次感谢里昂,干杯。