IsVisible无法在ListView中正确加载

时间:2019-08-26 09:18:51

标签: c# listview xamarin.forms

我有一个ListView,里面有一些项目,每个项目都有一些按钮,但取决于他自己的数据。

我的xaml:

<ListView
        x:Name="ListViewRepartos"
        Margin="10"
        CachingStrategy="RecycleElement"
        HasUnevenRows="True">

        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <Frame Margin="10" BackgroundColor="{Binding ColorVisita}">
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="*" />
                                <RowDefinition Height="Auto" />
                                <RowDefinition Height="*" />
                                <RowDefinition Height="Auto" />
                                <RowDefinition Height="*" />
                                <RowDefinition Height="Auto" />



                            </Grid.RowDefinitions>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto" />
                                <ColumnDefinition Width="*" />

                            </Grid.ColumnDefinitions>


                            <Label
                                Grid.Row="0"
                                Grid.Column="0"
                                Text="Cliente:" />
                            <Label
                                Grid.Row="1"
                                Grid.Column="0"
                                Text="Direccion:" />
                            <Label
                                Grid.Row="3"
                                Grid.Column="0"
                                Text="Importe:" />

                            <Label
                                Grid.Row="0"
                                Grid.Column="1"
                                LineBreakMode="WordWrap"
                                Text="{Binding Cliente}" />
                            <Label
                                Grid.Row="1"
                                Grid.RowSpan="2"
                                Grid.Column="1"
                                LineBreakMode="CharacterWrap"
                                Text="{Binding Direccion}" />
                            <Label
                                Grid.Row="3"
                                Grid.Column="1"
                                LineBreakMode="WordWrap"
                                Text="{Binding Importe}" />


                            <StackLayout
                                Grid.Row="5"
                                Grid.ColumnSpan="2"
                                Orientation="Horizontal">
                                <Grid>
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="50" />
                                    </Grid.RowDefinitions>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="*" />
                                        <ColumnDefinition Width="*" />
                                    </Grid.ColumnDefinitions>

                                    <Button
                                        Grid.Row="0"
                                        Grid.Column="0"
                                        Command="{Binding Entregar}"
                                        HorizontalOptions="CenterAndExpand"
                                        IsVisible="{Binding BotonesVisibles}"
                                        Text="Entregar" />
                                    <Button
                                        Grid.Row="0"
                                        Grid.Column="1"
                                        Command="{Binding Llevame}"
                                        HorizontalOptions="CenterAndExpand"
                                        IsVisible="{Binding BotonesVisibles}"
                                        Text="Llevame" />
                                    <Button
                                        Grid.Row="0"
                                        Grid.Column="0"
                                        Command="{Binding Cobrar}"
                                        HorizontalOptions="CenterAndExpand"
                                        IsVisible="{Binding BotonCobrosVisible}"
                                        Text="Cobros" />
                                    <Button
                                        Grid.Row="0"
                                        Grid.Column="1"
                                        Command="{Binding Modificar}"
                                        HorizontalOptions="CenterAndExpand"
                                        IsVisible="{Binding BotonModificarVisible}"
                                        Text="Modificar" />
                                </Grid>
                            </StackLayout>

                        </Grid>
                    </Frame>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

.cs加载ListView的项目:

 var resultado = new ObservableCollection<Modelos.Reparto>(Utils.Campos.Repartos.Select(q => ActivarBotones(q)).Where(q => q != null).ToList());
            Utils.UIHandler.RunOnUI(() => { 
                this.ListViewRepartos.ItemsSource = null;
                this.ListViewRepartos.ItemsSource = resultado;
                ListViewRepartos.EndRefresh();
            });

我加载了该项目并使用ActivarBotones激活了按钮:

private Modelos.Reparto ActivarBotones(Modelos.Reparto q)
    {
        try
        {                
            q.SetBotones(this);
            return q;
        }
        catch (Exception ex)
        {
            Utils.UIHandler.ErrorDebug("ListaRepartos: Warning", ex.Message, Utils.UIHandler.MessageLevel.Warning);
        }
        return null;
    }

我的模型中SetBotones所在的位置

 public bool BotonesVisibles
    {
        get { return Visitado == EstadoVisita.NoVisitado; }
    }

    public bool BotonCobrosVisible
    {

        get {
            return Visitado == EstadoVisita.Entregado || Visitado == EstadoVisita.EntregadoMod;
        }
    }
    public bool BotonModificarVisible
    {
        get
        {
            return Visitado == EstadoVisita.EntregadoMod;
        }
    }

public void SetBotones(Controladores.Controlador Host)
    {
        this.Entregar = new Command(() => {
            Host.Unico(async () => {
                Utils.UIHandler.NavPush(new Vistas.Entregar(this.DatosCabecera, this.DatosCobro, this));
            });
        });
        this.Llevame  = new Command(() => {
            Host.Unico(async () => {
                Utils.UIHandler.RunOnUI(() => { 
                    ....
            });
        });
        this.Cobrar = new Command(() => {
            Host.Unico(async () => {
                Utils.UIHandler.NavPush(new Vistas.DatosPago(this.DatosCabecera));
            });
        });
        this.Info     = new Command(() => {
            Host.Unico(async () => {
                Utils.UIHandler.NavPush(new Vistas.DatosCliente(this.DatosCliente));
            });
        });
        this.Modificar = new Command(() => {
            Host.Unico(async () => {
                Utils.UIHandler.NavPush(new Vistas.AlbaranFactura(this.DatosCabecera,this.DatosCliente));
            });
        });
    }

但是,当我看到带有真实数据的View时,有时它会正确显示,有时却无法正确显示,如果进入已点击的项目并按“后退”按钮返回,它会正确地装入按钮。

此图片是示例图片:

enter image description here

任何想法我做错了或为什么总是不能正确显示按钮吗?

编辑:

我将projecto更改为mvvm,但由于未显示正确的按钮而仍然出现空格:

xaml:

<StackLayout
                                Grid.Row="5"
                                Grid.ColumnSpan="2"
                                Orientation="Horizontal">
                                <Grid>
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="50" />
                                    </Grid.RowDefinitions>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="*" />
                                        <ColumnDefinition Width="*" />
                                    </Grid.ColumnDefinitions>

                                    <Button
                                        Grid.Row="0"
                                        Grid.Column="0"
                                        Command="{Binding Entregar}"
                                        HorizontalOptions="CenterAndExpand"
                                        IsVisible="{Binding BotonesVisibles}"
                                        Text="Entregar" />
                                    <Button
                                        Grid.Row="0"
                                        Grid.Column="1"
                                        Command="{Binding Llevame}"
                                        HorizontalOptions="CenterAndExpand"
                                        IsVisible="{Binding BotonLlevarVisible}"
                                        Text="Llevame" />
                                    <Button
                                        Grid.Row="0"
                                        Grid.Column="0"
                                        Command="{Binding Cobrar}"
                                        HorizontalOptions="CenterAndExpand"
                                        IsVisible="{Binding BotonCobrosVisible}"
                                        Text="Cobros" />
                                    <Button
                                        Grid.Row="0"
                                        Grid.Column="1"
                                        Command="{Binding Modificar}"
                                        HorizontalOptions="CenterAndExpand"
                                        IsVisible="{Binding BotonModificarVisible}"
                                        Text="Modificar" />
                                </Grid>
                            </StackLayout>
  

型号:

public EstadoVisita visitado = EstadoVisita.NoVisitado;

    public EstadoVisita Visitado
    {
        get
        {
            return visitado;
        }
        set
        {
            if(visitado == EstadoVisita.NoVisitado) { botonesvisibles = true; botonllevarvisible = true; }
            if(visitado == EstadoVisita.Entregado || visitado == EstadoVisita.EntregadoMod) { botoncobrosvisible = true; botonllevarvisible = false; botonesvisibles = false; }
            if(visitado == EstadoVisita.EntregadoMod) { botonmodificarvisible = true; botonllevarvisible = false; botonesvisibles = false; }
        }
    }

    public bool botonesvisibles = true;
    public bool BotonesVisibles
    {
        get { return botonesvisibles; }
        set { botonesvisibles = value; }
    }
    public bool botoncobrosvisible;
    public bool BotonCobrosVisible
    {
        get { return botoncobrosvisible; }
        set { botoncobrosvisible = value; }
    }
    public bool botonmodificarvisible;
    public bool BotonModificarVisible
    {
        get { return botonmodificarvisible; }
        set { botonmodificarvisible = value; }
    }
    public bool botonllevarvisible = true;
    public bool BotonLlevarVisible
    {
        get { return botonllevarvisible; }
        set { botonllevarvisible = value; }
    }

还有什么需要考虑的吗?

0 个答案:

没有答案