xamarin - 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 是不可见的。
解决方案
我不知道你想用这行代码做什么。
<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}}">
推荐阅读
- mongodb - 在 mongodb 中更新查询
- django - 未找到带有参数 '('',)' 的 'tagged' 的反向操作。尝试了 1 种模式:['^tag/(?P
[-\w]+)/$'] - javascript - 如何单击以使用 jQuery maphilight 更改突出显示颜色
- azure - 在 Ubuntu Server (18.04.6 LTS) Azure Vm 中从 docker 拉取图像时出错
- mysql - 如何解析错误消息中显示的 MySQL“Entry”和“Key”值
- php - PayPal 访客结帐未发送付款响应
- flutter - Flutter:TabView 内的 DataTable
- mysql - 在 SQL 中自动填充列
- typescript - 使用 ts-node 在 Next.js 项目中运行单个 .ts 文件以进行测试
- python - 在 imshow 中使用不同的颜色图来强调某些部分