Ксамарин, связывание метки - PullRequest
0 голосов
/ 15 октября 2018

Итак, я недавно только что переделал структуру проекта моего более крупного приложения в MVVM, однако я пытаюсь сделать простое связывание меток и не могу заставить что-либо работать вообще.Я, наверное, просто немного глуп и упускаю очевидную вещь, но не могу понять это.В настоящее время я не пытаюсь сделать это в ObservableCollection, потому что в настоящее время я не могу даже заставить работать основы.Просто простая метка.

Мой класс TaskModel содержит

public class TaskModel
{
    public string Title { get; set; }
}

Моя MainViewModel содержит

public class MainViewModel
{
    TaskModel task = new TaskModel
    {
        Title = "Hello"
    };
}

Мой MainPage Xaml содержит

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:local="clr-namespace:Testing"
         x:Class="Testing.MainPage"
         xmlns:bc="clr-namespace:Testing.ViewModels">

<ContentPage.Padding>
    <OnPlatform x:TypeArguments="Thickness" 
                iOS="0, 20, 0, 0"
                Android="0, 40, 0, 0">
    </OnPlatform>
</ContentPage.Padding>

<StackLayout BindingContext="{x:Reference Slider}" HorizontalOptions="Center" VerticalOptions="Center">
    <BoxView Color="Green" Opacity="{Binding Value}"></BoxView>
    <Label BindingContext="{x:Reference Slider}" Text="{Binding 
        Value, 
        StringFormat='Value is {0:F2}'}"
        Opacity="{Binding Value}">
    </Label>
    <Slider x:Name="Slider" ></Slider>
    <Label Text="{Binding TaskModel.Hello}"></Label>

</StackLayout>

И тогда мой MainPage.Xaml.CS содержит

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
        BindingContext = new MainViewModel();
    }
}

Так что, как видите, ничего особенного.Чувствую себя немного глупо, что я не могу решить это, и любая помощь в этом вопросе будет принята с благодарностью!

РЕДАКТИРОВАТЬ:

Игнорировать дополнительный XAML, XAML над надписью на базеЯ просто тестирую другое связывание на той же странице XAML, которое работает, просто пытаюсь заставить его связываться за пределами страницы, если вы понимаете, что я говорю.

Ответы [ 2 ]

0 голосов
/ 15 октября 2018
  1. Удалите BindingContext из следующего xaml, поскольку контекст распространяется на дочерние элементы управления.Следовательно, вы изменяете контекст Label на управление ползунком.Привязка не будет работать, если она указывает на неправильный контекст.

<StackLayout BindingContext="{x:Reference Slider}"

Привязки не работают с частными свойствами, и у вас есть личное поле в вашей ViewModel.Реализация INPC:
public class MainViewModel: INotifyPropertyChanged
{
    MainViewModel()
    {
       _task = new TaskModel()
       {
         Title = "Hello"
       };
    }          
    TaskModel _task; 
    public TaskModel TaskModel
    {
       get=>_task;
       set
       {  
          if (value!=_task)
          {
             _task = value;
             NotifyPropertyChanged(nameof(this.TaskModel));
          }
       }
    }
   public event PropertyChangedEventHandler PropertyChanged;
   protected virtual void OnPropertyChanged(string propertyName)
   {
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
   }
}

<Label Text="{Binding TaskModel.Title}"></Label>

Реализация INPC в TaskModel

public class TaskModel : INotifyPropertyChanged
{
    public string Title 
    { 
      get=>_title; 
      set=>
      {
         if (value!=_title)
         {
             value=title;
             OnPropertyChanged(nameof(Title));
         }
      } 
    }
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

Для получения дополнительной информации, пожалуйста,посетите документы .

0 голосов
/ 15 октября 2018

Измените вторую последнюю строку вашего xaml: Binding TaskModel.Hello на Binding TaskModel.Title.

Если это не поможет, внедрите INPC в свой класс TaskModel и вызовите его в сеттереTitle собственности

...