Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Xamarin表单(MVVM)中的绑定问题_C#_Mvvm_Binding_Xamarin.forms_Visual Studio Mac - Fatal编程技术网

C# Xamarin表单(MVVM)中的绑定问题

C# Xamarin表单(MVVM)中的绑定问题,c#,mvvm,binding,xamarin.forms,visual-studio-mac,C#,Mvvm,Binding,Xamarin.forms,Visual Studio Mac,我在理解带有mvvm的xaml时遇到一些问题。有时有效,但其他人无效 ViewModel(实现INotifyPropertyChanged): 视图: 在视图构造函数中: vm = new ViewModel(id); BindingContext = vm; OnAppearing(异步): 如果我在xaml中设置BindingContext并将其从 构造函数,它不工作 如果我在xaml中设置地址标签的绑定并将其从代码隐藏中删除,那么它将无法工作 如果我尝试使用Name作为页面的标题,它将

我在理解带有mvvm的xaml时遇到一些问题。有时有效,但其他人无效

ViewModel(实现INotifyPropertyChanged):

视图:

在视图构造函数中:

vm = new ViewModel(id);
BindingContext = vm;
OnAppearing(异步):

  • 如果我在xaml中设置BindingContext并将其从 构造函数,它不工作

  • 如果我在xaml中设置地址标签的绑定并将其从代码隐藏中删除,那么它将无法工作

  • 如果我尝试使用Name作为页面的标题,它将不起作用

  • 在所有这些情况下,我都没有收到任何类似“Binding:property not found on BindingContext”的错误,因此我知道它们正在被找到,但它们可能是空的

  • 如果修改Class1中的属性,则该属性不会显示在页面上。 我可以假定原因是类没有实现吗 InotifyProperty是否已更改

  • 在VM构造函数(Task.Run)或Page.OnAppearing(wait VM.LoadData())中加载数据更好还是更可取

有谁能提供一些指导吗

编辑:


我认为问题在于:

OnAppearing(异步):

必须在方法调用之前设置绑定

如果我在xaml中设置BindingContext并将其从 构造函数,它不工作

如何在
XAML
中设置它?必须向构造函数提供
int
参数。因此,在C#中设置页面的
BindingContext
很可能是有意义的:

请注意,这里引入了紧密耦合,因为
页面
知道
视图模型
的具体类型

如果我在xaml中设置地址标签的绑定并将其从 代码隐藏,它不工作

以下是带有绑定的
标签在
XAML
中的外观:

<Label Text="{Binding Address}" />
请注意,应该在设置页面的
BindingContext
后调用它

在上述任何情况下,我都不会遇到类似“绑定: 在BindingContext'上找不到属性,因此我知道它们是 被发现了,但可能是空的

尝试在
vm.LoadDataAsync()
之后放置一个断点,并检查
ViewModel
的内容

如果修改Class1中的属性,则该属性不会显示在页面上。 我可以假定原因是类没有实现吗 InotifyProperty是否已更改

我越是关注你的问题,它就越像是
inotifyptoperitychanged
的实现问题。你能分享相关的代码吗

在VM构造函数(Task.Run)或 在第页上显示(等待vm.LoadData())


构造函数应该尽可能简单,绝不允许用户构造函数执行可能失败的代码。因此,最好引入一个接口,您的
ViewModel
将实现该接口,并且该接口必须是
OnAppearing()
&
OnDisappearing()
,这样您的页面就不会知道
ViewModel
的具体类型。我想剩下的应该是清楚的。

这是一个相当多的调试(这也是为什么每篇文章一个问题可能更有意义的原因);但这里有:

  • 视图模型有一个接受参数的构造函数。如果在XAML中构造,它将使用默认值。基本上,您正在比较的两段代码是不等价的。如果需要该参数,请将其保持原状

  • 你需要调试这个;确保绑定属性对于初学者实际上不是空的

  • 不知道;与您可能需要调试它的地址相同

  • 你对这一点的解释是正确的;我将检查我的数据是否正确加载

  • 对。只有重新分配了
    FirstClass
    时,您当前的代码才会更新。要捕获该对象
    Class1
    中的属性赋值,需要INPC(也许这解释了2和/或3)

  • 我不确定这是否真的重要


  • 发布你的XAML和所有相关代码,你在同一个线程中问了很多问题,但没有提供完整的图片。可以。尽管有一些问题,我认为原因是一样的。这就是为什么我没有为每个线程打开一个线程。谢谢。实际上那一点很有效。不起作用的是,如果我注释该行并在XAML中设置绑定,就像(Text={binding Address})是我在XAML中设置标签绑定的方式一样,并且不起作用,如果我设置断点,我会看到所有的数据。感谢您指出ViewModel上的紧密耦合和OnAppearing,我理解。如果更容易的话,我会这样做,但我认为其中一些是相互关联的。谢谢你的帮助。
    vm = new ViewModel(id);
    BindingContext = vm;
    
    base.OnAppearing();
    await vm.LoadDataAsync();
    lAddress.SetBinding(Label.TextProperty, new Binding("Address");
    
    base.OnAppearing();
    lAddress.SetBinding(Label.TextProperty, new Binding("Address");
    await vm.LoadDataAsync();
    
    class MyPage
    {
        ViewModel vm;
    
        public MyPage(int id)
        {
            InitializeComponent();
            vm = new ViewModel(id);
            BindingContext = vm;
        }
    }
    
    <Label Text="{Binding Address}" />
    
    ContentPage.SetBinding(Page.TitleProperty, nameof(Class1.Name));