수색…
ListBox에서 DataTemplate 사용
다음 XAML 스 니펫이 있다고 가정 해 보겠습니다.
<ListBox x:Name="MyListBox" />
그런 다음이 XAML 파일의 코드 숨김에서 생성자에 다음을 작성합니다.
MyListBox.ItemsSource = new[]
{
1, 2, 3, 4, 5
};
응용 프로그램을 실행하면 입력 한 숫자 목록이 표시됩니다.
그러나 사용자 정의 유형의 객체 목록을 표시하려고하면
MyListBox.ItemsSource = new[]
{
new Book { Title = "The Hitchhiker's Guide to the Galaxy", Author = "Douglas Adams" },
new Book { Title = "The Restaurant at the End of the Universe", Author = "Douglas Adams" },
new Book { Title = "Life, the Universe and Everything", Author = "Douglas Adams" },
new Book { Title = "So Long, and Thanks for All the Fish", Author = "Douglas Adams" },
new Book { Title = "Mostly Harmless", Author = "Douglas Adams" }
};
우리는 Book 이라는 클래스가 있다고 가정합니다.
public class Book
{
public string Title { get; set; }
public string Author { get; set; }
}
목록은 다음과 같이 보일 것입니다 :
ListBox가 책 객체를 올바르게 표시하는 데 "충분히 똑똑하다"고 가정 할 수도 있지만 실제로 볼 수있는 것은 Book 유형의 전체 이름입니다. 실제로 ListBox가 표시하는 것은 표시 할 개체에 대해 기본 제공 ToString() 메서드를 호출하는 것이며 숫자의 경우 원하는 결과를 생성하는 반면 사용자 지정 클래스의 개체에서 ToString() 을 호출하면 이름을 가져옵니다. 스크린 샷에서 볼 수있는 유형입니다.
우리는 Book 클래스의 ToString() 을 작성함으로써이를 해결할 수 있습니다.
public override string ToString()
{
return Title;
}
그러나 그다지 유연하지는 않습니다. 저자를 표시하려면 어떻게해야할까요? ToString 에도이를 쓸 수 있지만, 앱의 모든 목록에서이를 원하지 않는다면 어떨까요? 멋진 책 표지는 어떻습니까?
그것이 DataTemplates가 도울 수있는 곳입니다. 이들은 필요에 따라 "인스턴스화"할 수있는 XAML 코드 조각으로, 생성 된 소스 데이터에 따라 세부 정보가 채워집니다. 간단히 말해, ListBox 코드를 다음과 같이 확장하면 :
<ListBox x:Name="MyListBox">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Title}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
이 목록은 소스의 각 항목에 대한 TextBox 를 만들고 해당 TextBox 의 Text 속성은 객체의 Title 속성에있는 값으로 채 Title .
이제 응용 프로그램을 실행하면 사용자 정의 ToString 구현을 삭제하더라도 * 위와 동일한 출력을 얻습니다. 이것에 대해 유익한 점은이 템플릿을 간단한 string (및 ToString )의 기능을 훨씬 넘어서 사용자 정의 할 수 있다는 것입니다. 사용자 지정 항목을 비롯하여 원하는 모든 XAML 요소를 사용할 수 있으며 이러한 값을 개체의 실제 데이터 (위 예제의 Title 과 같은)에 "바인딩"할 수 있습니다. 예를 들어, 다음과 같이 템플리트를 확장하십시오.
<ListBox x:Name="MyListBox">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock FontStyle="Italic" Text="{Binding Author}" />
<TextBlock FontSize="18" Text="{Binding Title}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
그렇다면 우리는 책의 형식화 된보기를 얻을 수 있습니다!



