Xamarin表单-ListView可见绑定到交换机,仅在两个交换机后显示整个ListView
我目前正在使用Xamarin表单和MVVM Light创建一个跨平台的Android/iOS应用程序 我的问题是,我试图使用一个开关来显示/隐藏开关下的ListView 编辑:问题仍然是一样的,但我发现,如果在导航到页面时列表IsVisible=true,它将正确呈现。似乎从一开始就不可能是IsVisible=false 当我第一次打开开关时,ListView只显示了一部分。如果我将其关闭,然后再次打开,则会呈现整个ListView。 图像可以更好地解释: 第一幅图显示开关接通前的状态 第二幅图显示开关已打开一次的状态。ListView的背景是浅绿色的,以便更好地查看 第三幅图显示开关已打开、关闭和打开的状态。ListView的背景仍然是浅绿色,但所有内容都按其应有的方式显示。 开关绑定到ViewModel中的bool,ListView IsVisible绑定到ViewModel中的bool。 当开关打开时,它会将IsVisible属性更改为true,这也会第一次显示列表 XAML视图代码段:Xamarin表单-ListView可见绑定到交换机,仅在两个交换机后显示整个ListView,listview,xamarin,xamarin.forms,uiswitch,Listview,Xamarin,Xamarin.forms,Uiswitch,我目前正在使用Xamarin表单和MVVM Light创建一个跨平台的Android/iOS应用程序 我的问题是,我试图使用一个开关来显示/隐藏开关下的ListView 编辑:问题仍然是一样的,但我发现,如果在导航到页面时列表IsVisible=true,它将正确呈现。似乎从一开始就不可能是IsVisible=false 当我第一次打开开关时,ListView只显示了一部分。如果我将其关闭,然后再次打开,则会呈现整个ListView。 图像可以更好地解释: 第一幅图显示开关接通前的状态 第二幅图
<Grid Padding="0, 10, 0, 0" VerticalOptions="Start" Grid.Row="0" BackgroundColor="{Binding Source={x:Static color:ColorService.BackgroundColor}}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Label Text="Show list" Grid.Column="0" HorizontalOptions="Start" VerticalOptions="Center" TextColor="{Binding Source={x:Static color:ColorService.TextColor}}"/>
<Switch IsToggled="{Binding IsCustomTeamNamesSwitchToggled}" Grid.Column="0" VerticalOptions="Center" HorizontalOptions="End" >
<Switch.HeightRequest>
<OnPlatform x:TypeArguments="x:Double">
<OnPlatform.iOS>
30
</OnPlatform.iOS>
<OnPlatform.Android>
50
</OnPlatform.Android>
</OnPlatform>
</Switch.HeightRequest>
<Switch.WidthRequest>
<OnPlatform x:TypeArguments="x:Double">
<OnPlatform.iOS>
50
</OnPlatform.iOS>
<OnPlatform.Android>
100
</OnPlatform.Android>
</OnPlatform>
</Switch.WidthRequest>
</Switch>
</Grid>
<ListView ItemsSource="{Binding TeamNameList}" Grid.Row="1" x:Name="listview" IsVisible="{Binding IsListVisible}" BackgroundColor="{Binding Source={x:Static color:ColorService.BorderColor}}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<ViewCell.View>
<Grid Padding="15, 0, 0, 0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="20"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Label Text="{Binding TeamShortName}" Grid.Column="0" VerticalOptions="Center" TextColor="{Binding Source={x:Static color:ColorService.TextColor}}"/>
<Entry Text="{Binding TeamName, Mode=TwoWay}" Grid.Column="1" VerticalOptions="Center" Placeholder="Placeholder" TextColor="{Binding Source={x:Static color:ColorService.TextColor}}"/>
</Grid>
</ViewCell.View>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
private ObservableCollection<Team> _teamNameList = new ObservableCollection<Team>();
public ObservableCollection<Team> TeamNameList {
get {
return _teamNameList;
}
set {
_teamNameList = value;
RaisePropertyChanged("TeamNameList");
}
}
private bool _isListVisible;
public bool IsListVisible {
get {
return _isListVisible;
}
set {
_isListVisible = value;
RaisePropertyChanged ("IsListVisible");
}
}
private bool _isCustomTeamNamesSwitchToggled;
public bool IsCustomTeamNamesSwitchToggled {
get {
return _isCustomTeamNamesSwitchToggled;
}
set {
_isCustomTeamNamesSwitchToggled = value;
RaisePropertyChanged ("IsCustomTeamNamesSwitchToggled");
if (_isCustomTeamNamesSwitchToggled)
IsListVisible = true;
else
IsListVisible = false;
}
}
ViewModel代码段:
<Grid Padding="0, 10, 0, 0" VerticalOptions="Start" Grid.Row="0" BackgroundColor="{Binding Source={x:Static color:ColorService.BackgroundColor}}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Label Text="Show list" Grid.Column="0" HorizontalOptions="Start" VerticalOptions="Center" TextColor="{Binding Source={x:Static color:ColorService.TextColor}}"/>
<Switch IsToggled="{Binding IsCustomTeamNamesSwitchToggled}" Grid.Column="0" VerticalOptions="Center" HorizontalOptions="End" >
<Switch.HeightRequest>
<OnPlatform x:TypeArguments="x:Double">
<OnPlatform.iOS>
30
</OnPlatform.iOS>
<OnPlatform.Android>
50
</OnPlatform.Android>
</OnPlatform>
</Switch.HeightRequest>
<Switch.WidthRequest>
<OnPlatform x:TypeArguments="x:Double">
<OnPlatform.iOS>
50
</OnPlatform.iOS>
<OnPlatform.Android>
100
</OnPlatform.Android>
</OnPlatform>
</Switch.WidthRequest>
</Switch>
</Grid>
<ListView ItemsSource="{Binding TeamNameList}" Grid.Row="1" x:Name="listview" IsVisible="{Binding IsListVisible}" BackgroundColor="{Binding Source={x:Static color:ColorService.BorderColor}}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<ViewCell.View>
<Grid Padding="15, 0, 0, 0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="20"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Label Text="{Binding TeamShortName}" Grid.Column="0" VerticalOptions="Center" TextColor="{Binding Source={x:Static color:ColorService.TextColor}}"/>
<Entry Text="{Binding TeamName, Mode=TwoWay}" Grid.Column="1" VerticalOptions="Center" Placeholder="Placeholder" TextColor="{Binding Source={x:Static color:ColorService.TextColor}}"/>
</Grid>
</ViewCell.View>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
private ObservableCollection<Team> _teamNameList = new ObservableCollection<Team>();
public ObservableCollection<Team> TeamNameList {
get {
return _teamNameList;
}
set {
_teamNameList = value;
RaisePropertyChanged("TeamNameList");
}
}
private bool _isListVisible;
public bool IsListVisible {
get {
return _isListVisible;
}
set {
_isListVisible = value;
RaisePropertyChanged ("IsListVisible");
}
}
private bool _isCustomTeamNamesSwitchToggled;
public bool IsCustomTeamNamesSwitchToggled {
get {
return _isCustomTeamNamesSwitchToggled;
}
set {
_isCustomTeamNamesSwitchToggled = value;
RaisePropertyChanged ("IsCustomTeamNamesSwitchToggled");
if (_isCustomTeamNamesSwitchToggled)
IsListVisible = true;
else
IsListVisible = false;
}
}
如果您需要查看一些代码或其他内容,请告诉我:
谢谢 我们对XF也有同样的问题,在修复之前,我们的解决方案是扩展元素basicaly,我只是从中继承,OnPropertyChanged如果isvisible设置为true,请执行this.FadeTo1f,50;。大多数时间都适用于此问题 更新 在我们调试了更多之后,我们发现这是因为托管对象列表视图、按钮等隐藏属性被更新了。这实际上是udated,但native elements属性没有更新,因此会导致此问题。 执行上面的修复几乎总是有效的,但它仍然只是一个解决方法 我已经有一段时间没有使用Xamarin表单了,所以我建议尝试看看它是否仍然存在,因为在手机上制作动画是一个相当繁重的过程
Vitor发布一段代码片段,以便我们查看正在处理的内容。从View和ViewModel中添加了一些代码:只是为了确认您可以尝试删除底部的“下一步”按钮。到目前为止,我在页面上放置列表视图和按钮的过程非常糟糕,因为相对于其他控件,列表视图很难调整自身大小。嗨,Jonas,这是一个解决方法。我将通过编辑这篇文章来添加我们发现正在发生的事情。但老实说,我不知道这是否还会发生,因为我们已经完成了这个项目,现在只与Xamarin.IOS和Xamarin.Android合作