基本的なObservableCollectionをフィルタリングするために実装したICollectionViewにバインドされたUserControlがあります。ObservableCollectionにデータを追加してもリストボックスの項目が更新されない
public partial class DataStorage : UserControl
{
public ObservableCollection<CardData> dataStore;
private ICollectionView cards;
private string filter;
public string itemsInList { get; set; }
public DataStorage()
{
// Default constructor
InitializeComponent();
// Set the dataStore to be ICollectionView
dataStore = new ObservableCollection<CardData>();
// Data Add
this.AddSample();
// Set the collection source
this.cards = CollectionViewSource.GetDefaultView(dataStore);
// set the filter
this.cards.Filter = ContainsFilter;
}
// Other content here...
私はのObservableCollectionにいくつかのサンプルデータを追加し、ユーザーコントロールを初期化したよう。次に、ICollectionViewをObservableCollectionのデフォルトビューに設定し、ファイラーを割り当てます。
この時点では、すべてが計画通りに動作し、TextBoxコントロールで更新すると、サンプルデータがフィルタリングされます。
私は、これらの変更は、UIに反映されないのObservableCollectionにデータを追加するために再び私AddSample()メソッドを呼び出した場合
。public void AddSample()
{
dataStore.Add(new CardData("tesat1", false, 1, 0));
dataStore.Add(new CardData("test2", false, 2, 0));
dataStore.Add(new CardData("test3", false, 3, 2));
dataStore.Add(new CardData("test4", false, 4, 4));
dataStore.Add(new CardData("test5", false, 5, 0));
dataStore.Add(new CardData("help", false, 1, 0));
dataStore.Add(new CardData("fish", false, 2, 0));
dataStore.Add(new CardData("cat", false, 3, 2));
dataStore.Add(new CardData("tease", false, 4, 4));
dataStore.Add(new CardData("whelp", false, 5, 0));
上記は私のAddSampleメソッドです。より多くのデータを追加するたびに、ビューを再作成してフィルタリングを試みました。私は、基になるコレクションが変更されたときのイベントハンドラを追加する必要がありますが、この中に何をすべきかを考えている関連
<TextBox x:Name="Filters" Text="{Binding Path=Filter, UpdateSourceTrigger=PropertyChanged}" Height="55" Width="335" VerticalContentAlignment="Center" FontSize="22" />
<ListBox Height="Auto" MaxHeight="200" MinHeight="0" x:Name="CardListBox"
ItemsSource="{Binding Path=Cards}"
SelectedItem="{Binding Path=SelectedCard}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Path=data}" Height="50" FontSize="22" VerticalAlignment="Center" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
-if
// Set the collection source
this.cards = CollectionViewSource.GetDefaultView(dataStore);
// set the filter
this.cards.Filter = ContainsFilter;
XAML?これは、私がAddSample()を呼び出すときにコレクションを変更するのと同じプロセスであるためです。
私の提案や考えが高く評価されています。
「カード」をプロパティとして設定しているとしますか?あなたはフィールド 'cards'のみを表示しています(バインディングを除くどこからでも参照しています) – Joe
デバッグするのはまずobservableコレクション(プロパティとして)にバインドされます。これはCollectionViewの問題をなくしますまたはフィルタリングする。 – Joe
'ItemsSource =" {バインディングパス=カード} "'もし 'Cards'があなたのソースに定義されていれば、それをあなたの質問に含めると役に立つかもしれません。 –