如何将整个页面绑定到BindingContext?

时间:2018-02-18 18:08:06

标签: c# xamarin xamarin.forms

在我的应用程序中,我有一种情况,我想在页面上显示一些对象,然后将此对象更改为不同的对象。

所以,我们认为我有 MainPage.xaml.cs

...
public Foo Item { get; set; }
public bool SomeCheck {
    get {
        return Item.Bar != "";
    }
}

public MainPage() {
    InitializeComponent();
    SetItem();
    BindingContext = this;
}

private void SetItem() {
    Item = DifferentClass.GetNewItem();
}

private void Next_Clicked(object sender, EventArds e){
    SetItem();
}
...

MainPage.xaml 是这样的:

...
<Label Text="{Binding Item.Bar}" IsVisible="{Binding SomeCheck}" />
<Button Text="Next" Clicked="Next_Clicked" />
...

所以我想将整个页面绑定到BindingContext,为实现这个目的,我设置了BindingContext = this;。我想要的行为是显示Bar返回的不同对象的GetNewItem()属性,我得到的是冻结页面。在调试器中项目正在改变,但在页面上我总是重视我在第一次调用时设置的内容。

所以问题是:我可以以某种方式更新BindingContext以显示我想要的内容吗?我试着打电话给OnPropertyChanged(),但它对我不起作用。

我知道我可以像

一样设置整个对象
BindingContext = { Bar = Item.Bar, SomeCheck = Item.Bar != "" };

它有效,但当然我的真实场景更复杂,所以我不想这样做。

1 个答案:

答案 0 :(得分:1)

使用OnPropertyChanged

XAML:

<Label Text="IsVisible" IsVisible="{Binding MyIsVisible}" />

在viewmodel中,在MainPage.xaml.cs中的情况下:

private bool myIsVisible = true;

public bool MyIsVisible
{ 
  get => myIsVisible; 
  set
  {
    myIsVisible = value; 
    OnPropertyChanged(nameof(MyIsVisible));
  }
}