2017-01-06 10 views
1

ユーザーコントロールの左側のリストボックスにパラメータのリストを表示し、詳細を右側に表示したエディタを作成しています手の側。 6つの異なるタイプのパラメータがあり、それぞれ独自の値のセットがあります。リストボックスは、各パラメータタイプを表示するためにDataTemplateを使用します。リストボックスのパラメータを選択すると、適切なテンプレートが右側にロードされるように、同様に右側で編集を行いたいと思います。次のXAMLコードは、左のリストボックスを表示するように機能しますが、右側には「コレクション」という単語を除いて何も表示できません。 Parametersは、パラメータのリストを含むObservableCollectionです。コンテンツプロバイダーリソースのxamlコードのセットだけでこれを実行しようとしていましたが、このMicrosoftの記事で提案されているテクニックに切り替えました:Simple Navigation Technique in WPF using MVVM。しかしながら、これはまったく同じ結果を与える。一覧の項目が選択されているのに何も表示されていないときに、ContentControlが適切なUserControlを表示しているはずです。スクリーンショットは、選択されたパラメータの右側に「コレクション」という単語ではなく、カスタムコントロールを表示する必要があります。 Snapshot of incorrect controlコンテンツコントロールをデータテンプレートのリストボックスと同じリストにバインドできません

":キー×" の、だからあなたのDataTemplateが自動的に適用されます

<DockPanel Grid.Row="1" DataContext="{Binding Parameters}"> 
     <ListBox DockPanel.Dock="Left" MinWidth="250" 
       ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" 
       SelectedItem="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}, Path=DataContext.SelectedParameter}" 
       Margin="0,0,15,0" HorizontalAlignment="Left"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal"> 
         <Image Source="{Binding Path=Icon}" Stretch="None" /> 
         <TextBlock Text="{Binding Position}" Margin="10,0,0,0" /> 
         <TextBlock Text="{Binding Name}" Margin="10,0,0,0" /> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
     <ContentControl Content="{Binding}"> 
      <ContentControl.Resources> 
       <DataTemplate x:Key="InputParameterTemplate" DataType="x:Type local:ParameterDisplayLineInput"> 
        <controls:EditInputParameter /> 
       </DataTemplate> 
       <DataTemplate x:Key="OutputParameterTemplate" DataType="x:Type local:ParameterDisplayLineOutput"> 
        <controls:EditOutputParameter /> 
       </DataTemplate> 
       <DataTemplate x:Key="LogicParameterTemplate" DataType="x:Type local:ParameterDisplayLineLogic"> 
        <controls:EditLogicParameter /> 
       </DataTemplate> 
       <DataTemplate x:Key="TableParameterTemplate" DataType="x:Type local:ParameterDisplayLineTable"> 
        <controls:EditTableParameter /> 
       </DataTemplate> 
       <DataTemplate x:Key="TimerParameterTemplate" DataType="x:Type local:ParameterDisplayLineTimer"> 
        <controls:EditTimerParameter /> 
       </DataTemplate> 
       <DataTemplate x:Key="NetworkListParameterTemplate" DataType="x:Type local:ParameterDisplayLineNetworkList"> 
        <controls:EditNetworkListParameter /> 
       </DataTemplate> 
      </ContentControl.Resources> 
     </ContentControl> 
    </DockPanel> 

答えて

0

(私はあなたが適切なバインディングを持っていると思います)。私は不正行為をして、適切な編集ラインのユーザーコントロールへのポインタを自分のパラメータ表示ラインモデルクラスに直接格納し、コンテンツコントロールをそれにバインドしました。コンテンツコントロールが特定の行の正しいデータテンプレートに自動的に変更されるようにする方法はありませんでした。私はそれを知っていて恥ずべきで頭をぶら下げていますが、他には何も働いていませんでした。

1

はそれを失います。私はこれをパント終わった

<DockPanel Grid.Row="1" DataContext="{Binding Parameters}"> 
    <ListBox DockPanel.Dock="Left" MinWidth="250" 
      ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" 
      SelectedItem="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}, Path=DataContext.SelectedParameter}" 
      Margin="0,0,15,0" HorizontalAlignment="Left"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal"> 
        <Image Source="{Binding Path=Icon}" Stretch="None" /> 
        <TextBlock Text="{Binding Position}" Margin="10,0,0,0" /> 
        <TextBlock Text="{Binding Name}" Margin="10,0,0,0" /> 
       </StackPanel> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
    <ContentControl Content="{Binding}"> 
     <ContentControl.Resources> 
      <DataTemplate DataType="x:Type local:ParameterDisplayLineInput"> 
       <controls:EditInputParameter /> 
      </DataTemplate> 
      <DataTemplate DataType="x:Type local:ParameterDisplayLineOutput"> 
       <controls:EditOutputParameter /> 
      </DataTemplate> 
      <DataTemplate DataType="x:Type local:ParameterDisplayLineLogic"> 
       <controls:EditLogicParameter /> 
      </DataTemplate> 
      <DataTemplate DataType="x:Type local:ParameterDisplayLineTable"> 
       <controls:EditTableParameter /> 
      </DataTemplate> 
      <DataTemplate DataType="x:Type local:ParameterDisplayLineTimer"> 
       <controls:EditTimerParameter /> 
      </DataTemplate> 
      <DataTemplate DataType="x:Type local:ParameterDisplayLineNetworkList"> 
       <controls:EditNetworkListParameter /> 
      </DataTemplate> 
     </ContentControl.Resources> 
    </ContentControl> 
</DockPanel> 
+0

返信いただきありがとうございます。私はすべてのキーを削除しましたが、まだ単語(コレクション)が表示されています。奇妙なのは、実際のテキストボックスを(スタックパネル内の)コンテンツコントロールの代わりに置くと、正しいプロパティにバインドされ、リストで選択された実際の値が表示されるということです。コンテンツコントロールがリストボックスの同じ項目をリストボックスに表示しない理由はわかりません。ほかに何が足りないのですか? – Arkitec

関連する問題