c# - 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;
}
解决方案
它是如何实现行为的TextChangedBehavior
?您是否将BindingContext
as 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);
}
}
}
推荐阅读
- nginx - 将 apscheduler 部署到生产环境会产生 WebSocketBadStatusException Handshake status 502 Bad Gateway
- flutter - 找出错误的根源——ParentDataWidget的错误使用
- python - 向 QAbstractListModel 子类添加新行时,QML 视图不会更新
- selenium - 并行运行 E2E 测试
- python - Python中的奇怪列表附加错误?
- javascript - ApexChart 100% 触及条形图,尽管我将 offsetY 设为 -30
- mysql - 2个盟友之间的mySql不同
- flutter - 如何在颤动中获得孩子相对于父母的位置
- angular - 如何将Angular中的下拉值传递给函数?
- javascript - 将列表从控制器发送到 ajax 时,未传递公司数据类型值