0

ViewModel:我想全选Persons(每个人可能属于Type:Employee、Manager 或 Customer并且是PersonType其中存在的Persons一个不同的集合),这是我想让 执行此操作的唯一操作ViewModel

View:我想要 a ComboBoxofPersonTypes和 aDataGrid根据选择PersonType的 of过滤ComboBox(换句话说,我想让ComboBox负责DataGrid Grouping)并且会在XAML.

有什么建议么?

谢谢你。

4

2 回答 2

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();
    }
}

我希望这将有所帮助。

于 2012-07-26T06:46:56.467 回答
2

只是为了完整性,这里是一个没有转换器的非(最小)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}"/>
于 2012-07-26T07:19:12.953 回答