ExpandableListView无法使用where条件展开列表

问题描述 投票:0回答:1

好吧,我的listview有一个文件.xaml。我的列表在我的MainViewModel中与Fournisseurs绑定。当我点击按钮MoreDetail按钮Button_Clicked我的列表展开。但是现在,如果复选框为true,我添加了一个复选框,没有问题我的列表完成,当我点击MoreDetail按钮时,我显示了所有信息。

但是当复选框为false时,我有一个列表只有valids fournisseurs(where条件)但是当我点击MoreDetail时,我的项目不会展开。我认为问题来自于这个问题。

如果你想我可以在GitHub上分享我的代码。

的.xaml

 <ContentPage.BindingContext>
         <local:MainViewModel />
    </ContentPage.BindingContext>
    <ListView   
                  x:Name="FournisseursListView"
                  ItemsSource="{Binding Fournisseurs}"
                  HasUnevenRows="True"
                  Margin="0,0,0,15"
                  ItemTapped="ListView_OnItemTapped"
                  BackgroundColor="White"
                >
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout Padding="1" >
                            <StackLayout Orientation="Horizontal">
                                <StackLayout>
                                    <Button Image="{Binding .AfficheInfo}"
                                         Margin="4,1,0,0"
                                         BackgroundColor="Transparent"  
                                         BorderColor="White"   
                                         BorderWidth="0"   
                                         BorderRadius="0"
                                         WidthRequest="40" 
                                         HeightRequest="40"/>
                                </StackLayout>
                                <StackLayout WidthRequest="250"  Margin="10,0,0,0" Spacing="0" >
                                        <Label Text="{Binding .LibelleFournisseurFormated}"
                                       TextColor="Navy"
                                       FontSize="Default"/>
                                        <Label Text="{Binding .CodeFournisseur}"
                                       TextColor="Navy"
                                       FontSize="Default"/>
                                </StackLayout>
                                <StackLayout >
                                    <Button Image="{Binding .MoreDetail}"
                                         Clicked="Button_Clicked"
                                         Margin="0,5,0,0"
                                         BackgroundColor="Transparent"  
                                         BorderColor="White"   
                                         BorderWidth="0"   
                                         BorderRadius="0"
                                         WidthRequest="31" 
                                         HeightRequest="31"/>
                                 </StackLayout>
                            </StackLayout>

                            <StackLayout IsVisible="{Binding IsVisible}"
                                         Orientation="Vertical"
                                         Margin="10,5,0,0">
                                <StackLayout Orientation="Horizontal">
                                    <Label Text="{Binding .CodeEntiteFournisseurFormated}" 
                                       TextColor="Navy"
                                       FontSize="Default"/>
                                    <Label Text="{Binding .ActifFournisseurFormated}" 
                                       TextColor="Navy"
                                       Margin="40,0,0,0"
                                       FontSize="Default"/>
                                    <Label Text="{Binding .EssoFournisseurFormated}" 
                                       TextColor="Navy"
                                       Margin="40,0,0,0"
                                       FontSize="Default"/>
                                </StackLayout>
                             </StackLayout>
                         </ViewCell>
                    </DataTemplate>
             </ListView.ItemTemplate>
       </ListView>
       <StackLayout Orientation="Horizontal">
            <controls:CheckBox 
                DefaultText="Afficher les fournisseurs inactifs" 
                Margin="0,0,0,15"
                CheckedChanged="CheckBox_CheckedChanged      

            />

      </StackLayout>

MainViewModel.cs

public MainViewModel() 
    {



        Fournisseurs = new ObservableCollection<Fournisseur>

        {
            new Fournisseur
            {
                CodeFournisseur = "100001A",
                LibelleFournisseur = "L'AGENCE OUATE",
                CodeEntiteFournisseur = "GCT",
                Adresse1Fournisseur = "100 RUE DU COLONNEL MOLL",
                Adresse2Fournisseur = "",
                CPFournisseur = "75017",
                VilleFournisseur = "PARIS",
                PaysFournisseur = "France",
                TelephoneFournisseur = "02.28.09.03.00",
                FaxFournisseur = "02.28.09.03.09",
                EmailFournisseur = "",
                BoolActifFournisseur = true,
                BoolEssoFournisseur = true,
                IsVisible = false,
            },
            new Fournisseur
            {
                CodeFournisseur = "100001A",
                LibelleFournisseur = "L'AGENCE OUATE",
                CodeEntiteFournisseur = "GCT",
                Adresse1Fournisseur = "100 RUE DU COLONNEL MOLL",
                Adresse2Fournisseur = "",
                CPFournisseur = "75017",
                VilleFournisseur = "PARIS",
                PaysFournisseur = "France",
                TelephoneFournisseur = "02.28.09.03.00",
                FaxFournisseur = "02.28.09.03.09",
                EmailFournisseur = "",
                BoolActifFournisseur = false,
                BoolEssoFournisseur = true,
                IsVisible = false,
            }
      };

     public void ShowOrHideDetailFournisseur(Fournisseur Fournisseur)
        {
            if (_oldFournisseur == Fournisseur)
            {
                // click twice on the same item will hide it
                Fournisseur.IsVisible = !Fournisseur.IsVisible;
                UpdateFournisseurs(Fournisseur);

            }
            else
            {
                if (_oldFournisseur != null)
                {
                    // hide previous selected item
                    _oldFournisseur.IsVisible = false;
                    UpdateFournisseurs(_oldFournisseur);
                }
                // show selected item
                Fournisseur.IsVisible = true;
                UpdateFournisseurs(Fournisseur);
            }

            _oldFournisseur = Fournisseur;
        }



        private void UpdateFournisseurs(Fournisseur Fournisseur)
        {

            var index = Fournisseurs.IndexOf(Fournisseur);
            Fournisseurs.Remove(Fournisseur);
            Fournisseurs.Insert(index, Fournisseur);


        }

.xaml.cs

 private void Button_Clicked(object sender, EventArgs e)
        {
            var button = sender as Button;
            var fournisseur = button.BindingContext as Fournisseur;
            var vm = BindingContext as MainViewModel;
            vm?.ShowOrHideDetailFournisseur(fournisseur);
        }

private void CheckBox_CheckedChanged(object sender, XLabs.EventArgs<bool> e)
        {
            var checkbox = sender as CheckBox;
            var vm = BindingContext as MainViewModel;


            if (checkbox.Checked == true) 
            {

                FournisseursListView.ItemsSource = vm.Fournisseurs;
             }
            else
            {                 
                FournisseursListView.ItemsSource = vm.Fournisseurs.Where(x=> x.BoolActifFournisseur == true);


            }
         }

选中时:可以展开项目List checked with an expand item未选中时:项目不会展开点击List unchecked, item doesn't expand on click

问题是:我可以在没有条件的情况下扩展列表但是当我提出类似(where)的条件时,我认为我的列表不刷新而且她不会扩展。

c# listview xamarin xamarin.forms xamarin.android
1个回答
0
投票

请使用以下代码。

private bool? _IsVisible;
    public bool? IsVisible
    {
        get { return _IsVisible; }
        set {
            _IsVisible = value;
            if(_IsVisible !=null)
            {
                OnPropertyChanged();

            }
        }

    }
     protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
            {

                PropertyChangedEventHandler handler = PropertyChanged;
                if (handler != null)
                {
                    handler(this, new PropertyChangedEventArgs(propertyName));
                }
            }

    private void UpdateProducts(Product product)
            {

                if(searchProducts != null && searchProducts.Count > 0)
                {
                    var index = searchProducts.IndexOf(product);
                    searchProducts.Remove(product);
                    searchProducts.Insert(index, product);
                }
                else
                {
                    var index = Products.IndexOf(product);
                    Products.Remove(product);
                    Products.Insert(index, product);
                }

            }



    private void ListView_OnItemTapped(object sender, ItemTappedEventArgs e)
            {
                var product = e.Item as Product;
                var vm = BindingContext as MainViewModel;

                if (string.IsNullOrEmpty(searchbar.Text))
                {
                    vm.searchProducts = new ObservableCollection<Product>();
                }

                vm?.ShowOrHidePoducts(product);
            }






    private void onsearchchanged(object sender ,TextChangedEventArgs e)
            {
                var vm = BindingContext as MainViewModel;

                if (string.IsNullOrEmpty(e.NewTextValue))
                    windowslistview.ItemsSource = vm?.Products;
                else
                {
                    if (!string.IsNullOrEmpty(e.NewTextValue))
                    {

                        var detailsdata = vm?.Products.Where(i =>
                   i.Name.ToLower().Contains(e.NewTextValue.ToLower())).ToList();

                        if(detailsdata !=null && detailsdata.Count> 0)
                        {
                            ObservableCollection<Product> myCollection = new ObservableCollection<Product>(detailsdata as List<Product>);
                            vm.searchProducts = myCollection;
                            windowslistview.ItemsSource = detailsdata;
                        }
                        else
                        {
                            windowslistview.ItemsSource = vm?.Products;
                        }
                    }

                }

            }
  1. 需要实现INotifyPropertyChanged事件的IsVisible
  2. 在listview中,如果搜索栏有测试,则获取搜索栏详细信息
  3. 在淋浴头方法请提供搜索列表数据的详细信息。
  4. 删除xml代码行qazxsw poi
© www.soinside.com 2019 - 2024. All rights reserved.