因此,我开发了带有复选框下拉列表的可编辑组合框。用户可以在组合框的文本框部分中键入内容,它应该过滤项目。但是我遇到了一个问题,即当FilterText更改时,过滤器无法触发。
这是我的Usercontrol XAML。所有代码都得到了简化。
<ComboBox x:Name="cmbBox" IsEditable="True" IsReadOnly="False"
ItemsSource="{Binding FilteredItems, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Text="{Binding FilterText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
IsDropDownOpen="{Binding DropDownOpen, Mode=TwoWay}" >
后面的代码如下:
public ICollectionView FilteredItems
{
get { return (ICollectionView)GetValue(FilteredItemsProperty); }
set { SetValue(FilteredItemsProperty, value); }
}
public static readonly DependencyProperty FilteredItemsProperty =
DependencyProperty.Register("FilteredItems", typeof(ICollectionView), typeof(ComboCheckBox), new PropertyMetadata(null));
public string FilterText
{
get { return (string)GetValue(FilterTextProperty); }
set { SetValue(FilterTextProperty, value); }
}
public static readonly DependencyProperty FilterTextProperty =
DependencyProperty.Register("FilterText", typeof(string), typeof(ComboCheckBox), new PropertyMetadata(null));
public ObservableCollection<Item> mItems
{
get { return (ObservableCollection<Item>)GetValue(mItemsProperty); }
set { SetValue(mItemsProperty, value); }
}
public static readonly DependencyProperty mItemsProperty =
DependencyProperty.Register("mItems", typeof(ObservableCollection<Item>), typeof(ComboCheckBox), new PropertyMetadata(null));
public ComboCheckBox()
{
InitializeComponent();
FilteredItems = CollectionViewSource.GetDefaultView(mItems);
// apply filtering delegate
FilteredItems.Filter = i =>
{
// This will be invoked for every item in the underlying collection every time Refresh is invoked
if (string.IsNullOrEmpty(FilterText)) return true;
Item m = (Item)i;
return m.Name.ToLower().Contains(FilterText.ToLower());
};
}
因此在我的构造函数中,我应用了过滤器委托。下面是我的MainWindow XAML:
<Window.DataContext>
<local:MainWindowsVM />
</Window.DataContext>
<Grid>
<dd:ComboCheckBox x:Name="combo" Width="400" Height="30" FilteredItems="{Binding DataSource}" mItems="{Binding OC}" />
</Grid>
和ViewModel:
private ObservableCollection<Item> _oc;
public ObservableCollection<Item> OC
{
get { return _oc; }
set
{
_oc = value;
OnPropertyChanged("OC");
}
}
private ICollectionView _datasouorce;
public ICollectionView DataSource
{
get { return _datasouorce; }
set
{
_datasouorce = value;
OnPropertyChanged("DataSource");
}
}
public MainWindowsVM()
{
oc = new ObservableCollection<Item>();
oc.Add(new Item { Name = "ACT", IsChecked = false });
oc Add(new Item { Name = "ADVICENNE", IsChecked = false });
oc.Add(new Item { Name = "NOVARTIS", IsChecked = false });
DataSource = CollectionViewSource.GetDefaultView(oc);
}
使用上面的代码,我能够成功查看下拉列表中的项目,这告诉我DataSource在MainWindow上已正确绑定到FilteredItems,但是由于某些原因,在文本框中键入内容时不会发生过滤器。但是,如果我将过滤器委托放置在主窗口VM中,则它可以工作,但是我希望将此逻辑放在后面的Usercontrol代码中,而不是在MainWindow中。
非常感谢任何建议。