首页 > 解决方案 > 将 IsVisible 绑定到 Xamarin 表单中的 bool 属性

问题描述

我有一个要绑定到布尔属性 ( HasNotifications) 的标签。但是,当属性为 false 时,标签保持可见。如果我在 XAML 中将 IsVisible 属性设置为 false,则标签不可见,因此问题似乎与绑定有关。

XAML:

<AbsoluteLayout
    HorizontalOptions="FillAndExpand"
    VerticalOptions="FillAndExpand">

    <Grid
        HorizontalOptions="FillAndExpand"
        VerticalOptions="FillAndExpand"
        AbsoluteLayout.LayoutFlags="All"
        AbsoluteLayout.LayoutBounds="0,0,1,1">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>

        <Label 
            Text="Title" 
            HorizontalOptions="Center"
            VerticalOptions="Center"
            TextColor="White"
            FontSize="Large"
            FontAttributes="Bold"
            Margin="5"
            BindingContext="{x:Reference DashboardPageView}"
            Grid.Row="0" />

        <Label 
            Text="Notifications" 
            HorizontalOptions="Start"
            VerticalOptions="Center"
            TextColor="White"
            FontSize="Medium"
            FontAttributes="Bold"
            Margin="3"
            BindingContext="{x:Reference DashboardPageView}"
            IsVisible="{Binding HasNotifications}"
            Grid.Row="1" />
    </Grid>
</AbsoluteLayout>

我的视图模型:

public bool HasNotifications
{
    get => this.hasNotifications;
    set => this.SetProperty(ref this.hasNotifications, value);
}

标签: xamarin.forms

解决方案


我认为您没有设置正确的BindingContext. 这HasNotifications是您的属性,ViewModelBindingContext您设置为标签的是 DashboardPageView。

我写了一个简单的演示,希望你能从中得到一些想法:

在xml中:

<Grid
HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand"
AbsoluteLayout.LayoutFlags="All"
AbsoluteLayout.LayoutBounds="0,0,1,1">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <Label 
    Text="Title" 
    HorizontalOptions="Center"
    VerticalOptions="Center"
    TextColor="Black"
    FontSize="Large"
    FontAttributes="Bold"
    Margin="5"
    Grid.Row="0" />

    <Label 
    Text="Notifications" 
    HorizontalOptions="Start"
    VerticalOptions="Center"
    TextColor="Black"
    FontSize="Medium"
    FontAttributes="Bold"
    Margin="3"
    IsVisible="{Binding HasNotifications}"
    Grid.Row="1" />

    <Button Text="change HasNotifications" Clicked="Button_Clicked" Grid.Row="2"/>
    
</Grid>

在 cs 中:

public partial class MainPage : ContentPage
{

    ViewModel myViewModel;
    public MainPage()
    {
        InitializeComponent();

        myViewModel = new ViewModel();

        BindingContext = myViewModel;
    }

    private void Button_Clicked(object sender, EventArgs e)
    {
        myViewModel.HasNotifications = !myViewModel.HasNotifications;
    }
}

public class ViewModel : INotifyPropertyChanged
{
    bool _HasNotifications;

    public event PropertyChangedEventHandler PropertyChanged;

    public ViewModel()
    {

    }

    public bool HasNotifications
    {
        set
        {
            if (_HasNotifications != value)
            {
                _HasNotifications = value;

                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("HasNotifications"));
                }
            }
        }
        get
        {
            return _HasNotifications;
        }
    }
}

如果您有任何问题,请随时问我。


推荐阅读