2017-08-09 39 views
1

我是新来的ICollectionView,我目前正在尝试过滤对象列表。将项目添加到ObservableCollection时更新ViewModel并传递过滤器<string>

这里是我的ViewModel:

public class ViewModel : INotifyPropertyChanged 
{ 
    private ObservableCollection<RevitFamily> _myData; 
    public ObservableCollection<RevitFamily> MyData 
    { 
     get { return _myData; } 
    } 

    string searchName = string.Empty; 
    ObservableCollection<string> searchKeywords = new ObservableCollection<string>(); 
      public string SearchName 
    { 
     get { return searchName; } 
     set 
     { 
      searchName = value; 
      myDataView.Filter = FilterName; 
      OnPropertyChanged("SearchName"); 
     } 
    } 
    public ObservableCollection<string> SearchKeywords 
    { 
     get { return searchKeywords; } 
     set 
     { 
      searchKeywords = value; 
      myDataView.Filter = FilterName; 
      OnPropertyChanged("SearchKeywords"); 
     } 
    } 
    ICollectionView myDataView; 
    public ViewModel() 
    { 
     _myData = new ObservableCollection<RevitFamily>(); 
     myDataView = CollectionViewSource.GetDefaultView(_myData); 
     //when the current selected changes store it in the CurrentSelectedPerson 
     myDataView.CurrentChanged += delegate 
     { 
      //stores the current selected person 
      CurrentSelectedFamily = (RevitFamily)myDataView.CurrentItem; 
     }; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    protected void OnPropertyChanged(string propertyName) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 

当我在的ObservableCollection“SearchKeywords”,在列表中正确地更新,但到通知“OnPropertyChanged”添加项目不是叫。我怎样才能做到这一点 ?

编辑:我添加了XAML部分和添加方法。

这是绑定ObservableCollection的XAML代码。

<Border Grid.Row="6" Grid.ColumnSpan="3" Height="100"> 
    <ItemsControl x:Name="ListKeywords" ItemsSource="{Binding SearchKeywords, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"> 
     <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <WrapPanel /> 
     </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <local:CrossLabel MyLabel="{Binding}" Remove="Kw_Remove"/> 
     </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</Border> 

这里是了Methode

private void Kw_Add(object sender, RoutedEventArgs e) 
{ 
    if (!_families.SearchKeywords.Contains(this.Keywords.Text)) 
    { 
     _families.SearchKeywords.Add(this.Keywords.Text); 
    } 
} 

当我添加关键字为“_families.SearchKeywords”的ItemControle得到新的项目,但过滤器哗哗与视图模型不适用。

+0

OnPropertyChanged(“SearchKeywords”)不叫??你是什么意思?如果放一个断点它不会被打到?抛出错误?或者是什么?请更具体 – Tuco

+0

您的最终目标是什么?它听起来好像你正在得到你想要的行为。为什么你需要激发'OnPropertyChanged'? –

+0

@Tuco我更新了我的帖子 – Thibaud

回答

1

只需在构造函数中订阅CollectionChanged事件,无需每次都替换集合。

public ViewModel() 
{ 
    searchKeywords.CollectionChanged += searchKeywords_CollectionChanged; 
} 

void searchKeywords_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    throw new NotImplementedException(); 
} 
+0

谢谢,而不是抛出新的我需要调用MyDataView.Refresh()来获取过滤器应用?编辑:把MyDataView.Filter和所有的好!谢谢 ! – Thibaud

+0

@Thibaud你做任何事情发生时你需要做的事......抛出一个异常可能不是你的实际需要:) – grek40

+0

Yup ^^我已经把MyDataView.Filter和所有的好!谢谢 !标记为已解决:) – Thibaud

0

将项目添加到ObservableCollection会导致集合触发其CollectionChanged事件。这与OnPropertyChanged无关。您的SearchKeywords财产是您的ViewModel类别的财产 - 您的OnPropertyChanged方法只有在您实际更改SearchKeywords的值时才会被调用,即将ObservableCollection替换为完全不同的ObservableCollection

+0

我不想替换所有的收藏,但添加/删除其中的项目。我更新了我的文章 – Thibaud

相关问题