Xamarin образует двухстороннее связывание, не стреляющее после начальной нагрузки - PullRequest
0 голосов
/ 29 мая 2019

У меня есть проблема, которая занимала часы за часами моего времени.Я уверен, что мне не хватает чего-то очевидного.Я воспроизвел проблему в упрощенной форме, которая использует только 1 кнопку и 1 ярлык.Метка правильно устанавливает начальное значение.После нажатия кнопки я пытаюсь изменить текст метки.От Дэвида до Терри.

Командная кнопка срабатывает, вызывается установщик, вызывается 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".Который показывает, что привязка близка к работе.

Помощь оценена.

1 Ответ

0 голосов
/ 02 июня 2019

Просто для записи я нашел проблему. По какой-то причине появился локальный пустой интерфейс INPC. Я предполагаю, что при использовании функции рефакторинга я щелкнул интерфейс реализации, а не добавил «использование». Поэтому, когда INPC не делает то, что должен делать, убедитесь, что вы используете реальный INPC, а не заглушку: -)

...