1

我对 WPF 很陌生,我正在玩 Bindings。我设法将 Binding 设置为 aList以显示,例如,网格中的人员列表。我现在想要的是在绑定上设置一个条件,并从网格中只选择满足这个条件的人。到目前为止,我所拥有的是:

// In MyGridView.xaml.cs
public class Person
{ 
    public string name;
    public bool isHungry;
}

public partial class MyGridView: UserControl
{
    List<Person> m_list;
    public List<Person> People { get {return m_list;} set { m_list = value; } }

    public MyGridView() { InitializeComponent(); }
}

// In MyGridView.xaml

<UserControl x:Class="Project.MyGridView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>    
         <DataGrid Name="m_myGrid" ItemsSource="{Binding People}" />
    </Grid>
</UserControl>

我现在想要的是只在列表Person中包含饥饿的实例。我知道一种在代码中执行此操作的方法,例如添加一个新属性:

public List<Person> HungryPeople
{
    get 
    {
        List<Person> hungryPeople = new List<Person>();
        foreach (Person person in People)
           if (person.isHungry)
                hungryPeople.Add(person);
        return hungryPeople;
    }
}

然后将 Binding 更改为HungryPeople。但是,我认为这不是一个很好的选择,因为它涉及制作额外的公共属性,这可能是不可取的。有没有办法在 XAML 代码中解决所有这些问题?

4

3 回答 3

5

使用带有过滤器的CollectionViewSource :

绑定:

<UserControl x:Class="Project.MyGridView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<UserControl.Resources>
    <CollectionViewSource x:key="PeopleView" Source="{Binding People} Filter="ShowOnlyHungryPeople" />
</UserControl.Resources>
    <Grid>    
         <DataGrid Name="m_myGrid" ItemsSource="{Binding Source={StaticResource PeopleView}}" />
    </Grid>
</UserControl>

过滤器:

private void ShowOnlyHungryPeople(object sender, FilterEventArgs e)
{
    Person person = e.Item as Person;
    if (person != null)
    {
       e.Accepted = person.isHungry;
    }
    else e.Accepted = false;
}
于 2013-10-17T13:22:58.793 回答
0

您可以做的是在您的绑定中使用转换器,在那里您可以根据需要过滤列表,并返回过滤后的列表。

<DataGrid Name="m_myGrid" ItemsSource="{Binding People, Converter=myConverter}" />

和转换器 -

public class MyConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        List<Person> hungryPeople = new List<Person>();
        foreach (Person person in value as List<Person>)
            if (person.isHungry)
                hungryPeople.Add(person);
        return hungryPeople;
    }
}
于 2013-10-17T13:16:52.793 回答
0

您不需要多个属性,只需ObservableCollection为您的Person类创建一个并绑定到ItemsSource您的DataGrid.

 public ObservableCollection<Person> FilterPersons{get;set;}

 <DataGrid Name="m_myGrid" ItemsSource="{Binding FilterPersons}" />

People在 View 的构造函数中使用您的主列表初始化此集合。

在每个过滤器(例如,匈牙利、口渴等)上,只需添加/删除PersonFilterPersonsDataGrid就会相应地更新。

于 2013-10-17T13:14:00.537 回答