2009-06-16 4 views
3

ListBox 및 ContentPanel이있는 WPF UserControl이 있습니다. ListBox는 사과와 오렌지가있는 ObservableCollection에 바인딩됩니다.이기종 목록에 대한 데이터 바인딩

사과를 선택하면 AppleEditor가 오른쪽에 보이고 Orange를 선택하면 콘텐츠 패널에 OrangeEditor가 표시됩니다.

답변

5

DataTemplating을 사용하여 다른 편집기를 만들고 적용하는 것이 좋습니다. '사과'와 '오렌지'의 차이점에 따라 DataTemplateSelector을 사용하는 것이 좋습니다. 또한 Type 속성과 같은 것이 있다면 DataTriggers을 사용하여 편집기를 전환 할 수도 있습니다.

사과와 오렌지가 들어있는 작은 샘플을 만들 수 있습니다. 그들에게는 몇 가지 공유 속성과 몇 가지 다른 속성이 있습니다. 그런 다음 UI에서 사용할 기본 IFruits의 ObservableCollection을 만들 수 있습니다.

public partial class Window1 : Window 
{ 
    public ObservableCollection<IFruit> Fruits { get; set; } 
    public Window1() 
    { 
     InitializeComponent(); 

     Fruits = new ObservableCollection<IFruit>(); 
     Fruits.Add(new Apple { AppleType = "Granny Smith", HasWorms = false }); 
     Fruits.Add(new Orange { OrangeType = "Florida Orange", VitaminCContent = 75 }); 
     Fruits.Add(new Apple { AppleType = "Red Delicious", HasWorms = true }); 
     Fruits.Add(new Orange { OrangeType = "Navel Orange", VitaminCContent = 130 }); 

     this.DataContext = this; 
    } 
} 

public interface IFruit 
{ 
    string Name { get; } 
    string Color { get; } 
} 

public class Apple : IFruit 
{ 
    public Apple() { } 
    public string AppleType { get; set; } 
    public bool HasWorms { get; set; } 
    #region IFruit Members 
    public string Name { get { return "Apple"; } } 
    public string Color { get { return "Red"; } } 
    #endregion 
} 

public class Orange : IFruit 
{ 
    public Orange() { } 
    public string OrangeType { get; set; } 
    public int VitaminCContent { get; set; } 
    #region IFruit Members 
    public string Name { get { return "Orange"; } } 
    public string Color { get { return "Orange"; } } 
    #endregion 
} 

다음으로, 우리는 단지 과일의 종류를 확인하고 올바른 DataTemplate을 할당합니다 DataTemplateSelector를 만들 수 있습니다.

public class FruitTemplateSelector : DataTemplateSelector 
{ 
    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     string templateKey = null; 

     if (item is Orange) 
     { 
      templateKey = "OrangeTemplate"; 
     } 
     else if (item is Apple) 
     { 
      templateKey = "AppleTemplate"; 
     } 

     if (templateKey != null) 
     { 
      return (DataTemplate)((FrameworkElement)container).FindResource(templateKey); 
     } 
     else 
     { 
      return base.SelectTemplate(item, container); 
     } 
    } 
} 

그런 다음 UI에, 우리는 사과와 오렌지의 두 가지 템플릿을 생성하고, 콘텐츠에 적용됩니다 확인하려면 선택기를 사용할 수 있습니다.

<Window x:Class="FruitSample.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:FruitSample" 
    Title="Fruits" 
    Height="300" 
    Width="300"> 
<Window.Resources> 

    <local:FruitTemplateSelector x:Key="Local_FruitTemplateSelector" /> 

    <DataTemplate x:Key="AppleTemplate"> 
     <StackPanel Background="{Binding Color}"> 
      <TextBlock Text="{Binding AppleType}" /> 
      <TextBlock Text="{Binding HasWorms, StringFormat=Has Worms: {0}}" /> 
     </StackPanel> 
    </DataTemplate> 

    <DataTemplate x:Key="OrangeTemplate"> 
     <StackPanel Background="{Binding Color}"> 
      <TextBlock Text="{Binding OrangeType}" /> 
      <TextBlock Text="{Binding VitaminCContent, StringFormat=Has {0} % of daily Vitamin C}" /> 
     </StackPanel> 
    </DataTemplate> 

</Window.Resources> 

<DockPanel> 
    <ListBox x:Name="uiFruitList" 
      ItemsSource="{Binding Fruits}" 
      DisplayMemberPath="Name" /> 
    <ContentControl Content="{Binding Path=SelectedItem, ElementName=uiFruitList}" 
        ContentTemplateSelector="{StaticResource Local_FruitTemplateSelector}"/> 
</DockPanel> 
</Window> 
+0

매우 상세한 답변을 보내 주셔서 감사합니다. –

+0

또한 템플릿 선택기를 사용하여 별도의 템플릿 대신 두 개의 다른 UserControl 중에서 선택할 수 있습니까? –

+0

UserControl 사이를 전환하려면 DataTrigger를 대신 사용하고 Trigger 's setter에서 Content를 설정하십시오. – rmoore

관련 문제