我目前正在使用Xamarin Forms和MVVM Light来创建一个跨平台的Android / iOS应用程序 .
我的问题是我尝试使用开关来显示/隐藏交换机下面的ListView .
编辑:问题仍然是相同的,但我发现如果导航到页面时列表IsVisible = true,它将被正确呈现 . 似乎从开始就不能是IsVisible = false .
当我第一次打开开关时,ListView仅部分显示 . 如果我将其关闭,然后再打开,则会渲染整个ListView . 图像可以更好地解释:
- 第一张图像显示开关打开前的状态
- 第二张图像显示开关已打开一次的状态 . ListView的背景是Aqua,可以更好地看到它
- 第三张图像显示开关已打开,关闭,打开的状态 . ListView的背景仍然是Aqua,但一切都按照它应该显示 .
交换机绑定到ViewModel中的bool,ListView IsVisible绑定到ViewModel中的bool . 当开关打开时,它将IsVisible属性更改为true,这也应该首次显示List .
XAML查看代码段:
<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>
ViewModel代码段:
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;
}
}
告诉我你是否需要看一些代码或其他任何东西:)
谢谢!
1 回答
我们遇到了与XF相同的问题,我们的解决方案直到修复它是为了扩展元素(基本上只是继承它)和OnPropertyChanged如果它的isvisible设置为true,做一个this.FadeTo(1f,50);.大部分时间都适用于此问题 .
UPDATE
在我们进一步调试之后,我们发现这是因为我们的托管对象(列表视图,按钮等)隐藏属性已更新 . 这实际上是过时的,但本机元素属性不会更新,因此会导致此问题 . 上面的修复工作几乎总是如此,但它仍然只是一个解决方案 .
我现在还没有使用Xamarin Forms一段时间,所以我建议试着看看它是否仍然发生,因为手机上的动画是一个非常繁重的过程 .
维托尔