如何解决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,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 是不可见的。
解决方法
预期:当调用 OnUserInteractionCommand 时,stack2 应该可见,stack1 不可见。
我修改了您关于转换器的代码并创建了简单的示例进行测试,没有问题。
<ContentPage
x:Class="FormsSample.simplecontrol.Page19"
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:converter="clr-namespace:FormsSample.converter">
<ContentPage.Resources>
<converter:Visibleconverter x:Key="VisibleConverter" />
</ContentPage.Resources>
<ContentPage.Content>
<StackLayout>
<StackLayout x:Name="stack1" IsVisible="{Binding IsSomethingVisible,Converter={StaticResource VisibleConverter}}">
<Label Text="Hello" />
<Label Text="Hi" />
<Label Text="stack1" />
</StackLayout>
<StackLayout x:Name="stack2" IsVisible="{Binding IsSomethingVisible}">
<Label Text="Hello" />
<Label Text="Hi" />
<Label Text="stack2" />
</StackLayout>
<Button
x:Name="btn1"
Clicked="btn1_Clicked"
Text="change visible" />
</StackLayout>
</ContentPage.Content>
Visibleconverter.cs:
public class Visibleconverter : IValueConverter
{
public object Convert(object value,Type targetType,object parameter,CultureInfo culture)
{
return !((bool)value);
}
public object ConvertBack(object value,CultureInfo culture)
{
throw new NotImplementedException();
}
}
我通过 button.click 更改 isSomethingVisible 值。
public partial class Page19 : ContentPage,INotifyPropertyChanged
{
private bool _isSomethingVisible;
public bool IsSomethingVisible
{
get { return _isSomethingVisible; }
set
{
_isSomethingVisible = value;
RaisePropertyChanged(nameof(IsSomethingVisible));
}
}
public Page19()
{
InitializeComponent();
this.BindingContext = this;
}
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this,new PropertyChangedEventArgs(propertyName));
}
}
private void btn1_Clicked(object sender,EventArgs e)
{
Device.BeginInvokeOnMainThread(() => { IsSomethingVisible = !IsSomethingVisible; });
}
}
,
我不知道你想用这行代码做什么。
<StackLayout x:Name="stack1" Spacing="4" IsVisible="{Binding IsSomethingVisible,Converter={x:Static converter:InverseBoolConverter.Create}}">
通常,您会在 App.xaml 中注册它,以便它可以在整个应用程序中使用。这不会是您最后一次需要反向布尔转换器。你也可以在页面资源中注册。
<ContentPage.Resources>
<converter:Visibleconverter x:Key="VisibleConverter" />
</ContentPage.Resources>
然后将转换器作为静态资源访问:
<StackLayout x:Name="stack1" IsVisible="{Binding IsSomethingVisible,Converter={StaticResource VisibleConverter}}">
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。