首页 > 解决方案 > Xamarin Forms 不更新 ListView

问题描述

我的 PropertyChanged 事件未在 xamarin 中更新我的列表视图。有人可以帮我吗?

当搜索栏文本发生变化时,会触发 RefreshListView 方法。

我的视图模型:

public class LebensmittelViewModel : INotifyPropertyChanged
{
    private ObservableCollection<Lebensmittel> lebensmittelList = new ObservableCollection<Lebensmittel>();
    public List<Lebensmittel> normalLebensmittelList = new List<Lebensmittel>();
    public event PropertyChangedEventHandler PropertyChanged;

    public LebensmittelViewModel()
    {
        normalLebensmittelList = App.LebensmittelDatabase.getAllLebensmittel();
    }

    public void RefreshListView(string searchBarText)
    {
        LebensmittelList = addItemInCollection(searchBarText);
    }

    public ObservableCollection<Lebensmittel> addItemInCollection(string searchBarText)
    {
        if (searchBarText != null)
        {
            foreach (var item in normalLebensmittelList)
            {
                if (item.Name.Contains(searchBarText) || item.Name.Contains(searchBarText.First().ToString().ToUpper()))
                {
                    LebensmittelList.Add(item);
                };
            }
        }
        return LebensmittelList;
    }

    public void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public ObservableCollection<Lebensmittel> LebensmittelList
    {
        get
        {
            return lebensmittelList;
        }
        set
        {
            lebensmittelList = value;
            OnPropertyChanged("LebensmittelList");
        }
    }
}

Einkaufsliste.xaml

<ContentPage.Content>
    <StackLayout Spacing="10" Padding="10">
        <SearchBar x:Name="searchBar" Text="{Binding searchBarText}" Placeholder="Lebensmittel suchen..." VerticalOptions="StartAndExpand">
            <SearchBar.Behaviors>
                <behavior:TextChangedBehavior/>
            </SearchBar.Behaviors>
        </SearchBar>
        <ListView x:Name="listView" ItemsSource="{Binding LebensmittelList}" HasUnevenRows="True">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout VerticalOptions="FillAndExpand" Orientation="Horizontal" Padding="10">
                            <Label Text="{Binding Name}" YAlign="Center" Font="Large"/>
                            <ia:Checkbox HorizontalOptions="EndAndExpand"/>
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </StackLayout>
</ContentPage.Content>

Einkaufsliste.xaml.cs

public Einkaufsliste ()
    {
        InitializeComponent ();
        BindingContext = new LebensmittelViewModel();
    }

我认为一切都应该没问题,但它不起作用。希望有人可以帮助我,

谢谢

编辑汤姆:

public void RefreshListView(string searchBarText)
    {
        addItemInCollection(searchBarText);
    }

    public void addItemInCollection(string searchBarText)
    {
        if (searchBarText != null)
        {
            foreach (var item in normalLebensmittelList)
            {
                if (item.Name.Contains(searchBarText) || item.Name.Contains(searchBarText.First().ToString().ToUpper()))
                {
                    AddItemToList(item);
                };
            }
        }
    }

    private void AddItemToList(Lebensmittel item)
    {
        lebensmittelList.Add(item);
        LebensmittelList = lebensmittelList;
    }

标签: c#listviewxamarinxamarin.forms

解决方案


它是如何实现行为的TextChangedBehavior?您是否将BindingContextas aLebensmittelViewModel用于调用RefreshListView

我会摆脱这种行为 :/ 并添加一个TextChanged事件,创建属性SearchBarText,因为我看不到它的声明位置并且你将它绑定到SearchBar,重构RefreshListView方法......我认为它应该可以工作。 .. :)

Einkaufsliste.xaml.cs

private LebensmittelViewModel vm = new LebensmittelViewModel();
public Einkaufsliste ()
{
    InitializeComponent ();
    BindingContext = vm;
}

public void OnSeachBarTextChange(object e, TextChangedEventArgs args)
{
    vm.RefreshListView();
}

Einkaufsliste.xaml

<ContentPage.Content>
    <StackLayout Spacing="10" Padding="10">
        <SearchBar x:Name="searchBar" Text="{Binding SearchBarText, Mode=TwoWay}" Placeholder="Lebensmittel suchen..." VerticalOptions="StartAndExpand" TextChanged="OnSeachBarTextChange">
        </SearchBar>
        <ListView x:Name="listView" ItemsSource="{Binding LebensmittelList}" HasUnevenRows="True">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout VerticalOptions="FillAndExpand" Orientation="Horizontal" Padding="10">
                            <Label Text="{Binding Name}" YAlign="Center" Font="Large"/>
                            <ia:Checkbox HorizontalOptions="EndAndExpand"/>
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </StackLayout>
</ContentPage.Content>

视图模型

private string _searchBarText;

public string SearchBarText
{
    get
    {
        return _searchBarText;
    }
    set
    {
        _searchBarText = value;
        OnPropertyChanged("SearchBarText");
    }
}

public void RefreshListView()
{
    if (!string.IsNullOrEmpty(searchBarText))
    {
        var matches = normalLebensmittelList.Where(x => x.Name.Contains(searchBarText) || x.Name.Contains(searchBarText.First().ToString().ToUpper())
        foreach (var item in matches)
        {
          LebensmittelList.Add(item);
        }
    }
}

推荐阅读