首先,我是 MVVM 的新手,但如果我遺漏了這一點,請隨時糾正我。
我正在使用 MVVM 社區工具包的 WPF 應用程式。我的應用程式架構看起來更像這樣:
- 我有簡單的
Model包含一些基本屬性
public class Package : ObservableObject
{
private string id;
public string Id
{
get => id;
set => SetProperty(ref id, value);
}
private string name;
public string Name
{
get => name;
set => SetProperty(ref name, value);
}
private string version;
public string Version
{
get => version;
set => SetProperty(ref version, value);
}
private string summary;
public string Summary
{
get => summary;
set => SetProperty(ref summary, value);
}
}
- 還有
ViewModel哪里有IList<Package>屬性和AsyncRelayCommand它呼叫的程序中,得到輸出和更新屬性。
class MainWindowViewModel : ObservableObject
{
public AsyncRelayCommand StartProcessCommand { get; }
public MainWindowViewModel()
{
StartProcessCommand = new AsyncRelayCommand(StartProcess, CanStartProcess);
}
private async Task StartProcess()
{
//Start process, collect the output and set the PackageList property
}
private IList<Package> packagesList;
public IList<Package> PackagesList
{
get => packagesList;
set => SetProperty(ref packagesList, value);
}
}
- 然后有一個
View系結完成的地方,如下所示:
<ListView ItemsSource="{Binding PackagesList, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}">
<ListView.View>
<GridView>
<GridViewColumn Header="Id" DisplayMemberBinding="{Binding Id}"/>
<GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}"/>
<GridViewColumn Header="Version" DisplayMemberBinding="{Binding Version}" />
<GridViewColumn Header="Summary" DisplayMemberBinding="{Binding Summary}"/>
</GridView>
</ListView.View>
</ListView>
以及呼叫 RelayCommand(異步)的按鈕。
這是我面臨的問題和問題
I would like to apply the Search TextBox to dynamically search the result of the IList<Package>, for this purpose I have create a SearchText in the ViewModel which updates the IList<Package> property on the PropertyChanged event. The problem is that my property is changing and I would like to not recall it every time from the process.
- Create a list
- Search the list and present it in a View
- In case I'm removing my searchText value it's still showing the list from the point 1
What will be best approach to achieve this?
This is so far where I got to but works only once, filter the list but not returning to previous list:
public void SearchItem()
{
PackagesList = packagesList.Where(package => package.Id == SearchText).ToList();
}
private string? searchText;
public string? SearchText
{
get => searchText;
set
{
SetProperty(ref searchText, value);
SearchItem();
}
}
uj5u.com熱心網友回復:
在里面MainWindowViewModel創建另一個屬性IList<Package>并呼叫它ResultList
private IList<Package> ResultList { get; set;} // Add Result list
private IList<Package> packagesList;
public IList<Package> PackagesList
{
get => packagesList;
set => SetProperty(ref packagesList, value);
}
將您的 ItemsSource 系結設定為ResultList。
<ListView ItemsSource="{Binding ResultList, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}">
<ListView.View>
<GridView>
<GridViewColumn Header="Id" DisplayMemberBinding="{Binding Id}"/>
<GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}"/>
<GridViewColumn Header="Version" DisplayMemberBinding="{Binding Version}" />
<GridViewColumn Header="Summary" DisplayMemberBinding="{Binding Summary}"/>
</GridView>
</ListView.View>
</ListView>
任何時候你設定你的PackagesList,你也設定了ResultList。現在當它開始搜索時,你做這樣的事情
public void SearchItem()
{
ResultList = packagesList.Where(package => package.Id == SearchText).ToList();
}
uj5u.com熱心網友回復:
根據你的說法,你想在洗掉文本后顯示所有資料?如果是這樣,你可以試試這個
public void SearchItem()
{
PackagesList = packagesList.Where(package => package.Id == SearchText || null == SearchText).ToList();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/381119.html
標籤:c# wpf search mvvm propertychanged
上一篇:如何更改串列框中的所有專案
下一篇:更新資料網格WPF中的單個單元格
