1

カスタムクラスのアイテムのリストがあります。そのクラスには、2 つの文字列値を持つ別のクラスの監視可能なコレクションが含まれています。もう一方の文字列値に基づいて、文字列値の 1 つにデータ バインドしたいと考えています。したがって、架空の例として:

public class Person
{
    public string Name { get; set; }
    public ObservableCollection<Pet> Pets { get; set; }
}
public class Pet
{
    public string AnimalType { get; set; }
    public string Name { get; set; }
}

次に、リスト ボックスを Person のリストにバインドします。

List<Person> people = new List<Person>();
Person p = new Person() { Name = "Joe", Pets = new ObservableCollection<Pet>() { new Pet() { Name = "Spot", AnimalType = "Dog" }, new Pet() { Name = "Whiskers", AnimalType = "Cat" } } };
people.Add(p);
p = new Person() { Name = "Jim", Pets = new ObservableCollection<Pet>() { new Pet() { Name = "Juniper", AnimalType = "Cat" }, new Pet() { Name = "Butch", AnimalType = "Dog" } } };
people.Add(p);
p = new Person() { Name = "Jane", Pets = new ObservableCollection<Pet>() { new Pet() { Name = "Tiny", AnimalType = "Dog" }, new Pet() { Name = "Tulip", AnimalType = "Cat" } } };
people.Add(p);
MyListBox.ItemsSource = people;

動物の種類が犬の場合、人の名前とペットの名前をバインドしたいと思います。インデクサーを使用してバインドできることはわかっていますが、ペット コレクションの 2 番目のエントリであっても、犬のエントリが特に必要です。以下の XAML は、コレクションの最初の項目を表示するために機能しますが、リストの 2 番目の項目については、犬がコレクションの 2 番目の項目であるため、正しくありません。

        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Height="55.015" Width="302.996">
                    <TextBlock TextWrapping="Wrap" Text="{Binding Name}" Height="25.015" VerticalAlignment="Top" Margin="0,0,8,0"/>
                    <TextBlock Text="{Binding Pets[0].Name}"></TextBlock>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>

これを達成する方法について誰かが指示を与えることができますか?

4

1 に答える 1

2

値コンバーターを使用して、犬のみを表示します。

XAML:

<TextBlock Text="{Binding Pets, Converter={StaticResource FindDogConverter}}" />

コードビハインド:

public class FindDogConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        IEnumerable<Pet> pets = value as IEnumerable<Pet>;
        return pets.Single(p => p.AnimalType == "Dog").Name;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
于 2012-05-23T22:06:29.850 に答える