2016-08-11 14 views
0

基本的な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コントロールで更新すると、サンプルデータがフィルタリングされます。

Pic of output

私は、これらの変更は、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()を呼び出すときにコレクションを変更するのと同じプロセスであるためです。

私の提案や考えが高く評価されています。

+1

「カード」をプロパティとして設定しているとしますか?あなたはフィールド 'cards'のみを表示しています(バインディングを除くどこからでも参照しています) – Joe

+1

デバッグするのはまずobservableコレクション(プロパティとして)にバインドされます。これはCollectionViewの問題をなくしますまたはフィルタリングする。 – Joe

+0

'ItemsSource =" {バインディングパス=カード} "'もし 'Cards'があなたのソースに定義されていれば、それをあなたの質問に含めると役に立つかもしれません。 –

答えて

0

まず、私はカードがListBox用のItemsSourceであると仮定しています。次に、あなたのアイテムをカードに追加した後、ItemSourceをnullに設定してから、それをカードに戻したり、アイテムのソースが何であれ元に戻したりします。

関連する問題