首页 文章

Xamarin Forms - ListView IsVisible绑定到Switch,仅显示2个开关后的整个ListView

提问于
浏览
0

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

我的问题是我尝试使用开关来显示/隐藏交换机下面的ListView .

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

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

  • 第一张图像显示开关打开前的状态

Before switch has been turned on

  • 第二张图像显示开关已打开一次的状态 . ListView的背景是Aqua,可以更好地看到它

After swtich has been turned on first time

  • 第三张图像显示开关已打开,关闭,打开的状态 . ListView的背景仍然是Aqua,但一切都按照它应该显示 .

enter image description here

交换机绑定到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 回答

  • 0

    我们遇到了与XF相同的问题,我们的解决方案直到修复它是为了扩展元素(基本上只是继承它)和OnPropertyChanged如果它的isvisible设置为true,做一个this.FadeTo(1f,50);.大部分时间都适用于此问题 .

    UPDATE

    在我们进一步调试之后,我们发现这是因为我们的托管对象(列表视图,按钮等)隐藏属性已更新 . 这实际上是过时的,但本机元素属性不会更新,因此会导致此问题 . 上面的修复工作几乎总是如此,但它仍然只是一个解决方案 .

    我现在还没有使用Xamarin Forms一段时间,所以我建议试着看看它是否仍然发生,因为手机上的动画是一个非常繁重的过程 .

    维托尔

相关问题