如何将绑定从Page
传递到View
?
我有这个页面(Xaml)
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:views="clr-namespace:DataBindingTests.Views"
xmlns:model="clr-namespace:DataBindingTests.ViewModels"
x:Class="DataBindingTests.Pages.CoolePage"
Title="CoolePage"
x:DataType="model:CoolesModel">
<VerticalStackLayout>
<Label Text="{Binding YourName}"></Label>
<views:MainView YourName="{Binding YourName}"></views:MainView>
<Button Command="{Binding ChangeNameCommand}"></Button>
</VerticalStackLayout>
</ContentPage>
及其CodeBehind:
using DataBindingTests.ViewModels;
namespace DataBindingTests.Pages;
public partial class CoolePage : ContentPage
{
public CoolePage()
{
this.BindingContext = new CoolesModel();
InitializeComponent();
}
}
如果我将一个String传递给我的MainView,它就会工作,并且会触发所有事件。当我使用绑定时,它不会。在这个简单的测试中,应用程序应该会显示两次相同的名称,但只有ContentPage的Label会打印YourName
属性
<views:MainView YourName="Lars"></views:MainView>〈--工程
<views:MainView YourName="{Binding YourName}"></views:MainView>〈--不起作用
这是主视图的XAML
<?xml version="1.0" encoding="utf-8" ?>
<ContentView xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:views="clr-namespace:DataBindingTests.Views"
x:Class="DataBindingTests.Views.MainView">
<VerticalStackLayout>
<Label Text="{Binding YourName}"
VerticalOptions="Center"
HorizontalOptions="Center" />
</VerticalStackLayout>
</ContentView>
这是主视图的代码隐藏
namespace DataBindingTests.Views;
public partial class MainView : ContentView
{
public String YourName
{
get
{
String value = (String)GetValue(MainView.YourNameProperty);
return value;
}
set
{
SetValue(MainView.YourNameProperty, value);
}
}
public static readonly BindableProperty YourNameProperty = BindableProperty.Create(nameof(YourName)
, typeof(String)
, typeof(MainView), defaultBindingMode:BindingMode.TwoWay, propertyChanged: OnYourNameChanged);
static void OnYourNameChanged(BindableObject bindable, object oldValue, object newValue)
{
Console.WriteLine(newValue);
}
public MainView()
{
this.BindingContext = this; // Ignore ParentContext
InitializeComponent();
}
}
2条答案
按热度按时间mbskvtky1#
您只需从
MainView.xaml.cs
的构造函数中删除代码this.BindingContext = this;
即可:更新日期:
上面的代码之所以有效是因为视图和页面中的属性具有相同的名称。
在这种情况下,您可以修改
MainView.xaml
的代码,如下所示:MainView.xaml.cs
CoolesModel.cs
MainPage.xaml.cs
zzlelutf2#
在这个简单的测试中,应用程序应该显示两次相同的名称,但只有ContentPage的Label打印了YourName属性
由于某种原因,您在中途覆盖了绑定上下文,并且页面绑定解析的上下文(通常使用它的方式,父上下文)与您在屏幕上实际看到的内容(即
this.BindingContext = this
)不同,而且您从未设置第二个上下文的属性。