2012-05-23 2 views
1

사용자 지정 클래스 항목 목록이 있습니다. 이 클래스는 두 개의 문자열 값을 가진 다른 클래스의 관찰 가능한 컬렉션을 포함합니다. 다른 문자열을 기반으로 문자열 값 중 하나에 데이터 바인딩을 수행하려고합니다. 그래서 가상의 예로서 :Observable 컬렉션을 포함하는 클래스 목록에 대한 데이터 바인딩 목록 상자

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

내가 그 사람의 목록에 목록 상자를 바인딩 :

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; 

을 나는, 사람과 애완 동물 이름의 이름을 바인딩 할 동물을 입력하면 개야. 인덱서를 사용하여 바인드를 할 수 있다는 것을 알고 있지만 애완 동물 컬렉션의 두 번째 항목 인 경우에도 특히 강아지 항목이 필요합니다.

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

사람이 나는 방법에 대한 몇 가지 방향을 제공 할 수 있습니다 개가 colelction에서 두 번째 항목이 때문에 XAML은 아래의 컬렉션의 첫 번째 항목을 표시하기 위해 작동하지만, 목록의 두 번째 항목은 잘못 이것을 성취 할 수 있습니까?

답변

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

감사합니다. 컨버터 매개 변수를 일반화 된 상태로 유지할 수있는 것처럼 보입니다. 그래서 이것이 꼭 필요한 것입니다. –

관련 문제