2012-07-26 43 views
0

ViewModel: 我想选择所有Persons(每个人可能Type的:员工,经理或客户,是PersonType一个独特的收藏是存在于Persons) 这是我想让ViewModel这样做的唯一操作。使用组合框的源组的自动生成的DataGrid

View: 我想要的PersonTypes一个ComboBox并基于选择的ComboBoxPersonType(在另一个字,我还想让ComboBox是负责任的DataGridGrouping),过滤,将尽一个DataGridXAML

有什么建议吗?

谢谢。

+0

你写分组时均值滤波? – blindmeis 2012-07-26 07:22:38

+0

@ blindmeis:我的意思是** 1 => **按类型分组(并在ComboBox的'Persons中加载'PersonTypes'的清单),** 2 => **过滤基于DataGrid的在'ComboBox'中选择的'PersonType'上 – Mohsen 2012-07-26 08:51:33

回答

3
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="50"/> 
     <RowDefinition Height="250"/> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="200"/> 
     </Grid.ColumnDefinitions> 
    <ComboBox x:Name="combo" ItemsSource="{Binding PersonTypes}" Tag="{Binding Persons}"/> 
    <DataGrid Grid.Row="1" AutoGenerateColumns="False"> 
     <DataGrid.ItemsSource> 
      <MultiBinding Converter="{StaticResource conv}"> 
       <Binding Path="Tag" ElementName="combo"/> 
       <Binding Path="SelectedItem" ElementName="combo"/> 
      </MultiBinding> 
     </DataGrid.ItemsSource> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding Name}"/> 
     </DataGrid.Columns> 
    </DataGrid> 

</Grid> 

    public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = new ViewModel(); 
    } 
} 
public class ViewModel 
{ 
    public ViewModel() 
    { 
     PersonTypes = new ObservableCollection<PersonType>() { PersonType.Manager, PersonType.Customer, PersonType.Employee }; 

     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 }); 
    } 
    public ObservableCollection<Person> Persons { get; set; } 
    public ObservableCollection<PersonType> PersonTypes { get; set; } 

} 
public class Person 
{ 
    public string Name { get; set; } 
    public PersonType Type { get; set; } 
} 

public enum PersonType 
{ 
    Manager = 0, 
    Employee = 1, 
    Customer = 2 
} 
public class MyConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (values.Count() > 1 && values[1] !=null && values[0] is ObservableCollection<Person>) 
     { 
      string ptype = values[1].ToString(); 
      ObservableCollection<Person> persons = (ObservableCollection<Person>)values[0]; 
      if (ptype != null && persons != null) 
      { 
       return persons.Where(p => p.Type.ToString() == ptype).ToList(); 
      } 
     } 

     return null; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

我希望这会有所帮助。

2

为了完整起见,这里是一个无转换器的非(最小)xaml解决方案。

XAML:

<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; 

           }; 
    } 
} 

persontype为枚举:

public enum PersonType 
{ 
    All, 
    Manager, 
    Customer, 
    Employee 
} 

编辑:以适应从注释

视图模型要求3210

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") 

XAML

<ComboBox ItemsSource="{Binding MyGroup}" SelectedItem="{Binding SelectedType}" /> 
    <DataGrid Grid.Row="1" ItemsSource="{Binding MyView}"/>