私はListBoxとContentPanelを持つWPF UserControlを持っています。 ListBoxは、リンゴとオレンジを含むObservableCollectionにバインドされています。異種リストへのデータバインディング
アップルを選択した場合、右側にAppleEditorが表示され、オレンジ色を選択すると、コンテンツパネルにOrangeEditorが表示されます。
私はListBoxとContentPanelを持つWPF UserControlを持っています。 ListBoxは、リンゴとオレンジを含むObservableCollectionにバインドされています。異種リストへのデータバインディング
アップルを選択した場合、右側にAppleEditorが表示され、オレンジ色を選択すると、コンテンツパネルに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で、我々はリンゴとオレンジのための2つのテンプレートを作成し、当社のコンテンツに適用されますかを決定するために、セレクタを使用することができます。
<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>
超詳細な回答ありがとうございます。 –
また、テンプレートセレクタを使用して、別々のテンプレートではなく2つの異なるUserControlを選択できますか? –
UserControlを切り替える場合は、代わりにDataTriggerを使用して、トリガーのセッターでContentを設定します。 – rmoore