1

私はWPFが初めてで、バインディングをいじっています。Listたとえば、グリッド内の人のリストを表示するために、Binding を a に設定することができました。私が今したいのは、Binding に条件を設定し、この条件を満たす人だけをグリッドから選択することです。私がこれまでに持っているものは次のとおりです。

// 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 に答える