C# Xamarin表单(MVVM)中的绑定问题
我在理解带有mvvm的xaml时遇到一些问题。有时有效,但其他人无效 ViewModel(实现INotifyPropertyChanged): 视图: 在视图构造函数中: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作为页面的标题,它将
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));