我有一个问题,花了我几个小时的时间。 我确定我错过了一些明显的东西。 我已经在仅使用 1 个按钮和 1 个标签的简化表单上重现了该问题。 标签正确设置为初始值。 单击按钮后,我正在尝试更改标签文本。 从大卫到特里。
命令按钮正在触发,setter正在被调用,onPropertyChange正在被调用。 有趣的是,在初始调试后,get'er不会再次触发。 (检查了所有明显的东西,属性是公共的,属性,它命名正确,指定 TwoWay(
。
//--- View Model code ---//
public class TestBindingVM : INotifyPropertyChanged
{
private string profileName;
public ICommand ChangeTextCommand { get; }
public TestBindingVM()
{
ProfileName = "David";
ChangeTextCommand = new Command(UpdateTextCommandAction);
}
public void UpdateTextCommandAction()
{
ProfileName = "Terry";
}
public string ProfileName
{
get => profileName;
set
{
profileName = value;
OnPropertyChanged("ProfileName");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
var propertyChangedCallback = PropertyChanged;
propertyChangedCallback?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
// ---------------------
// Complete XAML Layout :
//----------------------
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="TrackManager.Views.TestBindingPage">
<ContentPage.Content>
<StackLayout>
<Label Text="{Binding Path=ProfileName}"
VerticalOptions="CenterAndExpand"
HorizontalOptions="CenterAndExpand" />
<Button Margin="0,10,0,0" Text="Change Text"
Command="{Binding ChangeTextCommand}"
TextColor="White"
/>
</StackLayout>
</ContentPage.Content>
</ContentPage>
///----------------------------------------------//
// The page code, creating the bindingcontext //
///----------------------------------------------//
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class TestBindingPage : ContentPage
{
public ViewModels.TestBindingVM vm = new ViewModels.TestBindingVM();
public TestBindingPage ()
{
this.BindingContext = vm;
InitializeComponent();
}
}
。
这与这篇文章类似,没有得到完整的答案。 也许是由于缺少代码:
双向绑定 在 Xamarin 窗体中不起作用
加载时显示值"David"真是太奇怪了。 这表明绑定即将起作用。
感谢帮助。
只是为了记录,我发现了这个问题。 由于某种原因,INPC有一个本地的空接口。 我想在使用重构功能时,我单击了实现接口而不是添加"使用"。 因此,当 INPC 没有做它显然应该做的事情时,请检查您使用的是实际的 INPC 而不是一些存根:-(