Xamarin标签绑定

时间:2018-10-15 09:47:21

标签: c# xamarin binding label

因此,我最近刚刚将较大的应用程序项目结构重新构建为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 :(得分:0)

将xaml的倒数第二行从public FighterWithStick() : Fighter { ... public override void Fight() { //use stick } } 更改为Binding TaskModel.Hello

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

答案 1 :(得分:0)

  1. 从上下文xaml中删除BindingContext,因为上下文已传播到控件的子级。因此,将Label的上下文更改为滑块控件。如果绑定指向错误的上下文,绑定将不起作用。
  

Private Sub Worksheet_Change(ByVal Target As Range) Worksheets("Pivot").PivotTables("Test").PivotCache.Refresh End Sub

  1. 绑定不适用于私有属性,并且ViewModel中具有私有字段。实施INPC:
<StackLayout BindingContext="{x:Reference Slider}"
  1. 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)); } }

  2. 在TaskModel中实现INPC

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

有关更多信息,请访问docs