只是为了完整性,这里是一个没有转换器的非(最小)xaml 解决方案。
xml:
<Grid>
<Grid.Resources>
<ObjectDataProvider x:Key="srcPersonType" MethodName="GetValues" ObjectType="{x:Type System:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="local:PersonType"/>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</Grid.Resources>
<Grid.RowDefinitions>
<RowDefinition Height="auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<ComboBox ItemsSource="{Binding Source={StaticResource srcPersonType}}" SelectedItem="{Binding SelectedType}"/>
<DataGrid Grid.Row="1" ItemsSource="{Binding MyView}"/>
</Grid>
视图模型:
public class ViewModel
{
public ObservableCollection<Person> Persons { get; set; }
public ICollectionView MyView { get; set; }
private PersonType _selectedType;
public PersonType SelectedType
{
get { return _selectedType; }
set { _selectedType = value; this.MyView.Refresh(); }
}
public ViewModel()
{
Persons = new ObservableCollection<Person>();
Persons.Add(new Person() { Name = "ABC", Type = PersonType.Manager });
Persons.Add(new Person() { Name = "DEF", Type = PersonType.Manager });
Persons.Add(new Person() { Name = "GHI", Type = PersonType.Customer });
Persons.Add(new Person() { Name = "JKL", Type = PersonType.Manager });
Persons.Add(new Person() { Name = "MNO", Type = PersonType.Employee });
this.MyView = CollectionViewSource.GetDefaultView(this.Persons);
this.MyView.Filter = (item) =>
{
var person = (Person) item;
if (this.SelectedType == null || this.SelectedType == PersonType.All)
return true;
if (person.Type == this.SelectedType)
return true;
return false;
};
}
}
人物类型为枚举:
public enum PersonType
{
All,
Manager,
Customer,
Employee
}
编辑:以符合评论的要求
视图模型
public IEnumerable<PersonType> MyGroup { get { return this.Persons.Select(x => x.Type).Distinct(); } }
//when ever your Person collection is altered, you have to call OnPropertyChanged("MyGroup")
xml
<ComboBox ItemsSource="{Binding MyGroup}" SelectedItem="{Binding SelectedType}" />
<DataGrid Grid.Row="1" ItemsSource="{Binding MyView}"/>