Josh Smith のデモ MVVM アプリケーションを拡張して、その背後にあるプリンシパルをよりよく理解しようとしてきましたが、ListView を使用してビューにフィルター関数を実装しようとすると、壁にぶつかりました。
私は数時間を調査して手を出しましたが、うまくいきません。
私の最初のステップは、ビューのテキスト ボックスを ViewModel のプロパティにバインドすることでした。
<TextBox Height="25" Name="txtFilter" Width="150" Text="{Binding Path=Filter, UpdateSourceTrigger=PropertyChanged}"/>
これは私の VM で一致します。
public string Filter
{
get { return this.filter; }
set
{
this.filter = value;
OnFilterChanged();
}
}
私の VM はデータソースに ObservableCollection を使用していましたが、チュートリアルを読んだ後、それを ICollectionView に変換しようとしました。
internal ObservableCollection<StaffViewModel> InnerStaff { get; set; }
internal CollectionViewSource CvsStaff { get; set; }
public ICollectionView AllStaff
{
get { return CvsStaff.View; }
}
私のコンストラクターでは、次のように指定しました。
CvsStaff = new CollectionViewSource();
CvsStaff.Source = this.InnerStaff;
CvsStaff.Filter += ApplyFilter;
フィルター プロパティが更新されると、次の OnFilterChanged が呼び出されます。
private void OnFilterChanged()
{
CvsStaff.View.Refresh();
}
私の ApplyFilter 関数は次のとおりです。
void ApplyFilter(object sender, FilterEventArgs e)
{
StaffViewModel svm = (StaffViewModel)e.Item;
if (this.Filter.Length == 0)
{
e.Accepted = true;
}
else
{
e.Accepted = svm.LastName.Contains(Filter);
}
}
誰かが私を見つけるのを手伝ってくれる、私が犯したばかげた間違いはありますか? 私はWPFとMVVMパターンにかなり慣れていないので、まだ学んでいます!
編集
ビューでは、コレクションを次のようにバインドします。
<CollectionViewSource
x:Key="StaffGroup"
Source="{Binding Path=AllStaff}"
/>
ListView は次のようになります。
<ListView
Name="staffList"
AlternationCount="2"
DataContext="{StaticResource StaffGroup}"
ItemContainerStyle="{StaticResource StaffItemStyle}"
ItemsSource="{Binding}"
Grid.Row="1">