ListBox 및 ContentPanel이있는 WPF UserControl이 있습니다. ListBox는 사과와 오렌지가있는 ObservableCollection에 바인딩됩니다.이기종 목록에 대한 데이터 바인딩
사과를 선택하면 AppleEditor가 오른쪽에 보이고 Orange를 선택하면 콘텐츠 패널에 OrangeEditor가 표시됩니다.
ListBox 및 ContentPanel이있는 WPF UserControl이 있습니다. ListBox는 사과와 오렌지가있는 ObservableCollection에 바인딩됩니다.이기종 목록에 대한 데이터 바인딩
사과를 선택하면 AppleEditor가 오른쪽에 보이고 Orange를 선택하면 콘텐츠 패널에 OrangeEditor가 표시됩니다.
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>
매우 상세한 답변을 보내 주셔서 감사합니다. –
또한 템플릿 선택기를 사용하여 별도의 템플릿 대신 두 개의 다른 UserControl 중에서 선택할 수 있습니까? –
UserControl 사이를 전환하려면 DataTrigger를 대신 사용하고 Trigger 's setter에서 Content를 설정하십시오. – rmoore