2009-06-16 7 views
3

私はListBoxとContentPanelを持つWPF UserControlを持っています。 ListBoxは、リンゴとオレンジを含むObservableCollectionにバインドされています。異種リストへのデータバインディング

アップルを選択した場合、右側にAppleEditorが表示され、オレンジ色を選択すると、コンテンツパネルに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で、我々はリンゴとオレンジのための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> 
+0

超詳細な回答ありがとうございます。 –

+0

また、テンプレートセレクタを使用して、別々のテンプレートではなく2つの異なるUserControlを選択できますか? –

+0

UserControlを切り替える場合は、代わりにDataTriggerを使用して、トリガーのセッターでContentを設定します。 – rmoore

関連する問題