2016-10-11 16 views
-1

これは私の具体的なシナリオです。DataTemplateをCollectionContainerに追加する方法

ウィンドウのリソースコード:

... 
<Window.Resources> 
    <ResourceDictionary> 
     <CollectionViewSource x:Key="AdditionalStringData" Source="{Binding ViewModelObservableCollection_String}"/> 
     <CollectionViewSource x:Key="AdditionalCustomObjectData" Source="{Binding ViewModelObservableCollection_CustomObject}"/> 
     <ResourceDictionary.MergedDictionaries> 
      ... 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Window.Resources> 
... 

私はコレクションを表示する必要が一部:

... 
<StackPanel> 
    <ItemsControl> 
     <ItemsControl.ItemsSource> 
      <CompositeCollection> 
       <TextBlock Text="{Binding ViewModelTextProperty}"/> 
       <Button Command="{Binding ViewModelRelayCommand}">Command</Button> 
       <CollectionContainer Collection="{Binding Source={StaticResource AdditionalStringData}}" /> 
       <CollectionContainer Collection="{Binding Source={StaticResource AdditionalCustomObjectData}}" /> 
      </CompositeCollection> 
     </ItemsControl.ItemsSource> 
    </ItemsControl> 
</StackPanel> 
... 

ViewModelに(それが正しくバインドされていることを前提と)

... 
private string ViewModelTextProperty { get; set; } = "Sample Text"; 
public RelayCommand ViewModelRelayCommand { ... } 
private ObservableCollection<string> ViewModelObservableCollection_String { get; set; } = new ObservableCollection<string>(); 
private ObservableCollection<CustomObject> ViewModelObservableCollection_CustomObject { get; set; } = new ObservableCollection<CustomObject>(); 
... 

にClass CutomObject(表示する必要はないかもしれません):

... 
public class CustomObject 
{ 
    public string firstString; 
    public string secondString; 

    public CustomObject() 
    { 
     ... 
    } 
    ... 
} 
... 

ObservableCollectionに適切な内容があるとします。

私の質問は、コレクションを正しく表示するにはどうすればいいですか?ここで が基準です:最初の行で

  • 、「サンプルテキスト」
  • 次のラベルが付いたボタンであると言い、その中のテキスト「コマンド」とのTextBlockがあるでしょう
  • 次行数(ViewModelObservableCollection_String個)はTextBlocksです。そのテキストは、個々の項目の値であるViewModelObservableCollection_Stringでなければなりません。
  • 次の行は、テキストボックスです(ViewModelObservableCollection_CustomObject)。そのテキストは、ViewModelObservableCollection_CustomObject(連結:firstStringsecondString)の個々の項目の値である必要があります。

ご覧のとおり、StackPanelの内容は、異なるDataTemplateの複数のコレクションのマージです。

明確でないものがあるかどうかを尋ねてください。

答えて

1
  1. ItemTemplate内部使用DataTriggerTypeを比較しながら、使用ControlControlTemplateを変更します。このためには、型を返すコンバータを使用します。

    または、

  2. ItemTemplateとして使用ContentControl

  3. DataTypeを指定してDataTemplateを定義します。 ContentControlは、そのContentTemplateに対して自動的に適切なDataTemplateを選択します。

第二のアプローチ(推奨)

<Window.Resources> 
    <ResourceDictionary>    
     ... 
     <DataTemplate DataType="{x:Type sys:String}"> 
      <TextBlock Background="ForestGreen" Text="{Binding .}"/> 
     </DataTemplate> 

     <DataTemplate DataType="{x:Type local:CustomObject}"> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Background="Red" Text="{Binding firstString}"/> 
       <TextBlock Background="Red" Text="{Binding secondString}"/> 
      </StackPanel> 
     </DataTemplate> 
    </ResourceDictionary> 
</Window.Resources> 
<ItemsControl> 
... 
<ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <ContentControl Content="{Binding .}"/> 
    </DataTemplate> 
</ItemsControl.ItemTemplate> 
... 
</ItemsControl> 
+0

感謝。もっと詳しく教えていただけますか?私はWPFで比較的新しいです。 – someone

+0

私は、あなたの2番目の提案は簡単だと思います。サンプルコードを提供していただけますか?そうでない場合は、私にそれに関する参考資料を与えてください。 – someone

関連する問題