2010-08-03 4 views
10

저는 WPF에 비교적 익숙하지 않습니다. 아마도이 작업을 수행하는 데는 여러 가지 방법이있을 것입니다. 그러나 작업을 시도한 것들을 얻을 수는 없습니다.WPF ListBox의 단일 목록에서 여러 유형을 표시 하시겠습니까?

두 가지 유형이 포함 된 ObservableCollection이 있습니다.

이 목록을 ListBox에 바인딩하고 발생한 각 유형별로 다른 DataTemplate을 표시하려고합니다. 유형에 따라 데이터 템플릿을 자동으로 전환하는 방법을 알 수 없습니다.

내가 DataTemplate을의 데이터 형식 속성을 사용하려고 시도하고 ControlTemplates과 DataTrigger를 사용하여 시도했지만 아무 소용이, 하나는 아무것도가 표시되지 않습니다, 또는 그것이 내 유형을 찾을 수없는 주장이 ...

예 : 아래의 시도 :

나는 단지 하나의 데이터 템플릿이 ListBox에 연결되어 있지만 작동하지 않습니다.

XAML : 뒤에

<Window x:Class="WpfApplication1.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="300" Width="300"> 
<Window.Resources> 
    <DataTemplate x:Key="PersonTemplate"> 
     <TextBlock Text="{Binding Path=Name}"></TextBlock> 
    </DataTemplate> 

    <DataTemplate x:Key="QuantityTemplate"> 
     <TextBlock Text="{Binding Path=Amount}"></TextBlock> 
    </DataTemplate> 

</Window.Resources> 
<Grid> 
    <DockPanel> 
     <ListBox x:Name="MyListBox" Width="250" Height="250" 
ItemsSource="{Binding Path=ListToBind}" 
ItemTemplate="{StaticResource PersonTemplate}"></ListBox> 
    </DockPanel> 
</Grid> 
</Window> 

코드 :

public class Person 
{ 
    public string Name { get; set; } 

    public Person(string name) 
    { 
     Name = name; 
    } 
} 

public class Quantity 
{ 
    public int Amount { get; set; } 

    public Quantity(int amount) 
    { 
     Amount = amount; 
    } 
} 

public partial class Window1 : Window 
{ 
    ObservableCollection<object> ListToBind = new ObservableCollection<object>(); 

    public Window1() 
    { 
     InitializeComponent(); 

     ListToBind.Add(new Person("Name1")); 
     ListToBind.Add(new Person("Name2")); 
     ListToBind.Add(new Quantity(123)); 
     ListToBind.Add(new Person("Name3")); 
     ListToBind.Add(new Person("Name4")); 
     ListToBind.Add(new Quantity(456)); 
     ListToBind.Add(new Person("Name5")); 
     ListToBind.Add(new Quantity(789)); 
    } 
} 

답변

6

Addiontal 정보 "그것은 내 유형을 찾을 수 없습니다 주장하고있다." 문제를 해결해야합니다.

문제는 대부분 CLR 네임 스페이스와 어셈블리를 참조하는 XAML에서 네임 스페이스 선언을 만들지 않는 것입니다. 당신은 XAML의 최상위 요소에 이런 식으로 뭔가를 둘 필요가 :이 작업을 수행하면, XAML은 XML 네임 스페이스 접두사 foo 아무것도가 MyNamespaceName 네임 스페이스에 MyAssemblyName의 클래스가 실제로는 것을 알 수

xmlns:foo="clr-namespace:MyNamespaceName;assembly=MyAssemblyName" 

.

그럼 당신은 DataTemplate 만든 마크 업이 XML 네임 스페이스를 참조 할 수 있습니다

<DataTemplate DataType="{foo:Person}"> 

당신은 확실히 템플릿 선택을 구축 할 수 있습니다,하지만 필요하지 않는 소프트웨어에 cruft에의 조각을 추가입니다 거기있어. WPF 응용 프로그램에서 템플릿 선택기를 사용할 수있는 곳이 있지만 그렇지 않습니다.

+2

+1 당신 말이 맞아요. 왜 내가이 멋진 옵션을 보지 못했는지 궁금합니다. 여기에 msdn - 링크 : http://msdn.microsoft.com/en-us/library/system.windows.datatemplate.datatype.aspx – HCL

+0

DataTemplateSelector는 내가 이것을 넣어 한번 cruft 것 같습니다. 제안 주셔서 감사. 이 문제를 해결할 수있는 쉬운 방법이 있어야한다고 생각하고 제공했습니다. – davisoa

+1

나를 위해 작동하지 않지만 않습니다. 오식? –

6

당신은 DataTemplateSelector을 사용해야합니다. 예를 들어 here을 참조하십시오. 당신은 말할 MSDN

+0

매력처럼 작동합니다! 감사! – davisoa

+1

템플릿 선택기를 사용할 필요가 없습니다. WPF의 기본 템플릿 선택 방법은 여기에 필요한 것을 정확히 수행합니다. –