2010-12-13 3 views
1

User 클래스와 User 클래스를 확장 한 Author 클래스가 있습니다. ObservableCollection < 사용자 >이 ListBox에 표시됩니다. 이를 위해 각 항목을 표시하는 DataTemplate과 선택한 각 항목을 표시하는 DataTemplate이 있습니다. 또한 ListBox.SelectedItem 속성의 속성에 바인딩 된 TextBoxes 열이 있습니다. 여태까지는 그런대로 잘됐다.확장 클래스에 대해 다른 컨트롤을 표시하려면 DataTemplates 또는 UserControl을 사용해야합니까?

선택한 사용자가 작성자이고 모두 잘 작동하지만 현재 부정 행위를하고있는 상황에서 필자는 열 및 DataTemplates에 별도의 컨트롤을 표시하고 있습니다. User 클래스에 IsAuthor bool 속성을 추가하여 바인딩 할 수 있고 사용자가 작성자인지 여부를 확인할 수 있습니다. 나는 그것이 틀렸다는 것을 알고 있지만, 다른 방법으로는 그것을 할 수 없다. 그래서 나의 첫 번째 질문은 어떻게 확장 된 클래스를 기본 클래스와 다르게 표시 하는가? 저자에 대해 다른 DataTemplate을 시도했지만 결코 작동하지 않았습니다 ... 컬렉션이 User 유형 이었기 때문에 아마도?

두 번째 질문은 UserControl의 열에 많은 TextBox 컨트롤이 있어야하며 작성자 관련 컨트롤의 Visibility를 변경하거나 어떻게 든 DataTemplate에 넣고 각 유형에 하나씩 만들어야합니까? 현재 첫 번째 메서드를 사용하고 있고 현재 선택된 항목이 작성자가 아닌 경우 Author 속성에 바인딩 된 각 컨트롤이 오류를 던지고 있습니다 (Visual Studio의 출력 창에서 볼 수 있음).

답변

2

데이터 템플릿을 사용하는 비슷한 설정이 있는데 상속 된 클래스와 잘 맞습니다. 이게 내가 한 일이야.

<DataTemplate x:Key="ShowTime" DataType="TestApp.User"> 
    <TextBlock Text="{Binding Path=Name}" HorizontalAlignment="Center"/> 
</DataTemplate> 
<DataTemplate DataType="{x:Type local:User}"> 
    <StackPanel Margin="10"> 
    <TextBlock Text="{Binding Path=Name}"/> 
    <TextBlock Text="{Binding Path=Age}"/> 
    </StackPanel> 
</DataTemplate> 
<DataTemplate DataType="{x:Type local:Author}"> 
    <StackPanel Margin="10"> 
    <TextBlock Text="{Binding Path=Name}"/> 
    <TextBlock Text="{Binding Path=Age}"/> 
    <TextBlock Text="{Binding Path=FirstTitle}"/> 
    </StackPanel> 
</DataTemplate> 

첫 번째 템플릿 목록 자체에 표시 될 것입니다 : 나는 다음과 같은 DataTemplates이있는 Window.Resources 섹션에서

<ListBox Name="UserList" ItemsSource="{Binding Path=Users}" 
     ItemTemplate="{StaticResource ShowUserName}" 
     SelectedItem="{Binding Path=SelectedUser, Mode=TwoWay}"> 
</ListBox> 
<ContentControl Content="{Binding ElementName=UserList, Path=SelectedItem}"/> 

. 목록 상자의 ItemTemplate 속성에서 key를 사용하여 참조합니다. 다른 두 데이터 템플릿은 선택한 항목에 대해 표시 할 내용을 결정할 때 콘텐츠 컨트롤에서 사용됩니다. 선택한 항목이 사용자 일 경우 User DataTemplate이 표시되고 작성자가 선택되면 작성자 DataTemplate이 표시됩니다.

x : Type local : 작성자가 클래스 유형을 참조하고 있습니다. local은 네임 스페이스 선언에 선언되어야합니다.

xmlns:local="clr-namespace:TestApp" 

여기가 내 네임 스페이스이므로 사용중인 것을 지정해야합니다. 그리고 물론 데이터 템플릿은 단지 기본적인 예제 일뿐입니다. 아마도 여러분은 여러분의 어플리케이션에 더 적합한 것을하고자 할 것입니다.

그러나 두 클래스에 대해 거의 똑같은 두 개의 별도 데이터 템플릿을 정의해야 할 수도 있습니다. 당신은 분명히 할 수 있겠지만. 나는 각 응용 프로그램에서 (이 예제가 아닌)이 작업을 수행합니다. 왜냐하면 각 유형별로 표시 할 내용이 크게 다르기 때문입니다.

그래서 모든 사용자 속성에 대해 공통 DataTemplate을 만들고이 DataTemplate을 작성자 용으로 확장하면 유용합니다. 당신이 이런 식으로 템플릿을 설정할 수 있습니다 그렇게하려면 : 당신이 볼 수있는

<DataTemplate x:Key="UserTemplate"> 
    <!-- show all the properties of the user class here --> 
</DataTemplate> 
<DataTemplate DataType="{x:Type local:User}"> 
    <ContentPresenter Content="{Binding}" ContentTemplate="{StaticResource UserTemplate}"/> 
</DataTemplate> 
<DataTemplate DataType="{x:Type local:Author}"> 
    <StackPanel> 
    <ContentPresenter Content="{Binding}" ContentTemplate="{StaticResource UserTemplate}"/> 
    <!-- show all the additional Author properties here --> 
    </StackPanel> 
</DataTemplate> 

따라서, 사용자 및 저자에 대한 DataTemplates 모두는 "UserTemplate"라는 DataTemplate을을 사용하여 시작합니다. 그러나 Author DataTemplate에서는 Author 특정 속성을 추가합니다.

도움이 되었기를 바랍니다.

+0

실제로 도움이됩니다. 매우 명확한 설명에 감사드립니다. 나는 또한 당신이 실수로 내 질문에 대한 또 다른 질문에 대답했다고 생각합니다 : http://stackoverflow.com/questions/4355045/is-there-something-in-wpf-similar-to-style-basedon-for-datatemplate/4356909 # 4356909. 나는 당신에게 신용을 줄 게시물을 편집합니다. – Sheridan

+0

항상 도와 주셔서 감사합니다 :) – Liz

관련 문제