【问题标题】:Xamarin label bindingXamarin 标签绑定
【发布时间】:2019-03-19 17:13:14
【问题描述】:

所以我最近刚刚将较大的应用程序项目结构重新设计为 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 页面中测试其他绑定,这是有效的,如果你明白我的意思,只是试图让它绑定到页面之外.

【问题讨论】:

  • 当您更改父母的 BindingContext 时,它会更改您孩子的上下文。您更改了 StackLayout 的上下文。 2. 绑定不适用于私有属性,并且您的 ViewModel 中有私有字段。您的 viewModel 没有 NotifyPropertyChanged。

标签: c# xamarin binding label


【解决方案1】:
  1. 从以下 xaml 中删除 BindingContext,因为上下文传播到控件的子级。因此,您将 Label 的上下文更改为滑块控件。如果指向不正确的上下文,绑定将不起作用。

&lt;StackLayout BindingContext="{x:Reference Slider}"

  1. 绑定不适用于私有属性,并且您的 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));
   }
}
  1. &lt;Label Text="{Binding TaskModel.Title}"&gt;&lt;/Label&gt;

  2. 在 TaskModel 中实现 INPC

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));
    }
}

欲了解更多信息,请访问docs

【讨论】:

    【解决方案2】:

    将 xaml 的倒数第二行:Binding TaskModel.Hello 更改为 Binding TaskModel.Title

    如果这不能解决问题,请在您的 TaskModel 类中实现 INPC 并在 Title 属性的设置器中调用它

    【讨论】:

    • 我尝试实现 INPC,但仍然一无所获,我有一个名为 title 的私有字符串并将其设置为“Title”,我有 public string title { get { return title; } 然后我有一个 setter set { title = value; OnPropertyChanged(); }。我还实现了 OnPropertyChanged 的​​方法。
    猜你喜欢
    • 2016-09-25
    • 2016-01-28
    • 2021-08-17
    • 2021-06-19
    • 1970-01-01
    • 2018-11-15
    • 2018-09-09
    • 2019-01-09
    • 1970-01-01
    相关资源
    最近更新 更多