수색…


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 를 만들고 해당 TextBoxText 속성은 객체의 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>

그렇다면 우리는 책의 형식화 된보기를 얻을 수 있습니다!

여기에 이미지 설명을 입력하십시오.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow