Xamarin表单-ListView可见绑定到交换机,仅在两个交换机后显示整个ListView

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。 图像可以更好地解释: 第一幅图显示开关接通前的状态 第二幅图

我目前正在使用Xamarin表单和MVVM Light创建一个跨平台的Android/iOS应用程序

我的问题是,我试图使用一个开关来显示/隐藏开关下的ListView

编辑:问题仍然是一样的,但我发现,如果在导航到页面时列表IsVisible=true,它将正确呈现。似乎从一开始就不可能是IsVisible=false

当我第一次打开开关时,ListView只显示了一部分。如果我将其关闭,然后再次打开,则会呈现整个ListView。 图像可以更好地解释:

第一幅图显示开关接通前的状态 第二幅图显示开关已打开一次的状态。ListView的背景是浅绿色的,以便更好地查看 第三幅图显示开关已打开、关闭和打开的状态。ListView的背景仍然是浅绿色,但所有内容都按其应有的方式显示。 开关绑定到ViewModel中的bool,ListView IsVisible绑定到ViewModel中的bool。 当开关打开时,它会将IsVisible属性更改为true,这也会第一次显示列表

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>
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合作