我遇到了一个问题,这花费了我数小时的时间。我确信我缺少明显的东西。我以仅使用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();
}
}
...
这类似于此帖子,没有得到完整的答案。也许由于缺少代码:
Two way binding Not working In Xamarin Forms
太奇怪了,加载时显示了“ David”值。这表明绑定已接近工作。
帮助表示赞赏。
答案 0 :(得分:0)
仅作记录,我发现了问题。由于某种原因,INPC有一个本地的空接口。我猜想在使用重构功能时,我单击了实现接口,而不是添加了“ using”。因此,当INPC没有按照其应有的方式工作时,请检查您使用的是实际的INPC,而不是存根:-)