首页 > 解决方案 > Xamarin Forms:IsVisible 绑定无法正常工作

问题描述

我正在尝试在用户交互中更新选项卡式页面的堆栈布局的可见性,并且反向布尔值似乎无法立即工作。我必须转到另一个页面并再次回来查看逆布尔转换器是否正常工作。任何人都可以建议我是否缺少任何东西。

XAML:

<page:ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
                    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                    xmlns:page="clr-namespace:My.Pages"
                    x:Class="Home"
                    xmlns:converter="clr-namespace:My.Pages.ValueConverters"
.....//....>
    
        <StackLayout x:Name="stack1" Spacing="4" IsVisible="{Binding IsSomethingVisible, Converter={x:Static converter:InverseBoolConverter.Create}}">
            <Label Text="Hello" IsVisible="{Binding IsSomethingelseVisible}"/>
            <Label Text="Hi" IsVisible="{Binding IsSomethingelse2Visible}"/>
        </StackLayout>
        <StackLayout x:Name="stack2" Spacing="4" IsVisible="{Binding IsSomethingVisible}">
            <Label Text="Hello" IsVisible="{Binding IsSomethingelseVisible}"/>
            <Label Text="Hi" IsVisible="{Binding IsSomethingelse2Visible}"/>
        </StackLayout>

转换器:

public class InverseBoolConverter : IValueConverter
    {
        public static InverseBoolConverter Create {
            get {
                return new InverseBoolConverter();
            }
        }

        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return !((bool)value);
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return !((bool)value);
        }
    }

视图模型:

private bool _isSomethingVisible;
        public bool IsSomethingVisible
        {
            get { return _isSomethingVisible; }
            set
            {
                _isSomethingVisible = value;
                RaisePropertyChanged(nameof(IsSomethingVisible));
            }
        }
    
Public Void OnUserInteractionCommand()
{
    DoSomething().ContinueWith((task) => {
        Device.BeginInvokeOnMainThread(() =>{ IsSomethingVisible = true;});
    });
}

当前情景:

默认情况下stack1是可见的,但是OnUserInteractionCommand调用时stack2是可见的,stack1也是可见的,用户需要转到不同的页面并再次返回,然后stack2是可见的,stack1是不可见的。

预期:何时OnUserInteractionCommand调用 stack2 应该是可见的,而 stack1 是不可见的。

标签: xamarinxamarin.formsmvvmcross

解决方案


我不知道你想用这行代码做什么。

<StackLayout x:Name="stack1" Spacing="4" IsVisible="{Binding IsSomethingVisible, Converter={x:Static converter:InverseBoolConverter.Create}}">

通常,您会在 App.xaml 中注册它,以便可以在整个应用程序中使用它。这不会是您最后一次需要反向布尔转换器。Yoiu 也可以在页面资源中注册。

<ContentPage.Resources>
    <converter:Visibleconverter x:Key="VisibleConverter" />
</ContentPage.Resources>

然后只需将转换器作为静态资源访问:

<StackLayout x:Name="stack1" IsVisible="{Binding IsSomethingVisible, Converter={StaticResource VisibleConverter}}">

推荐阅读