2017-09-06 9 views
0

私はWPFプロジェクト(C#、Visual Studio 2010、MVVM)を持っており、質問があります。コントロールテンプレートの交換

私は現在、ListBoxにアイテムテンプレートを持っています。これは以下のようになります。

<ListBox.ItemTemplate> 
    <DataTemplate> 
     <Grid> 
      <Thumb Name="myThumb" Template="{StaticResource NodeVisualTemplate}"> 

       <i:Interaction.Triggers> 
        <i:EventTrigger EventName="DragDelta"> 
         <cmd:EventToCommand Command="{Binding ChatNodeListViewModel.DragDeltaCommand, Source={StaticResource Locator}}" PassEventArgsToCommand="True"/> 
        </i:EventTrigger> 

       </i:Interaction.Triggers> 
      </Thumb> 
     </Grid> 
    </DataTemplate> 
</ListBox.ItemTemplate> 

テンプレートは、(国境やテキストボックスなどの)一連の制御である「NodeVisualTemplate」です。

私がやりたいこと、および私がしたいことは、そのアイテム内のプロパティに基づいて、そのテンプレートを別のテンプレートに置き換えることができるようにすることです。 ListBoxでは、各ListBoxItemには「ChatNodeViewModel」というデータコンテキストがあります。私は、どのテンプレートが使われたかを指示するプロパティを持つことを望んでいました。

これは可能ですか?もしそうなら、それはどうやって行えますか?

答えて

1

です:

<ListBox.ItemTemplate> 
    <DataTemplate> 
     <Grid> 
      <Thumb Name="myThumb" Template="{StaticResource NodeVisualTemplate}"> 
       <i:Interaction.Triggers> 
        <i:EventTrigger EventName="DragDelta"> 
         <cmd:EventToCommand Command="{Binding ChatNodeListViewModel.DragDeltaCommand, Source={StaticResource Locator}}" PassEventArgsToCommand="True"/> 
        </i:EventTrigger> 
       </i:Interaction.Triggers> 
      </Thumb> 
     </Grid> 
     <DataTemplate.Triggers> 
      <DataTrigger Binding="{Binding YourProperty}" Value="1"> 
       <Setter TargetName="myThumb" Property="Template" Value="{StaticResource NodeVisualTemplateOne}" /> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding YourProperty}" Value="2"> 
       <Setter TargetName="myThumb" Property="Template" Value="{StaticResource NodeVisualTemplateTwo}" /> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding YourProperty}" Value="3"> 
       <Setter TargetName="myThumb" Property="Template" Value="{StaticResource NodeVisualTemplateThree}" /> 
      </DataTrigger> 
     </DataTemplate.Triggers> 
    </DataTemplate> 
</ListBox.ItemTemplate> 
2

は、例えばDataTrigger

<DataTrigger Binding="{Binding ElementName=myElement,Path=IsChecked}" 
       Value="True"> 
     <Setter Property="Template" 
       Value="{StaticResource myTemplate}"/> 
    </DataTrigger> 

を使用してみてください、上記のチェックボックスが

+0

は私がmyThumbでMYELEMENTを交換するか、ということは、何か他のものですか?ありがとう。 – TheFaithfulLearner

+0

はい、あなたの 'Thumb'はあなたがバインドしたい要素になります – DNKROZ

1

をチェックされている場合は、DataTrigger上のテンプレートを使用して、スタイルの親指を使用し、中あなたの財産に結合することができるテンプレートを入れ替えますあなたのViewModel、つまりYourProperty

<Thumb> 
    <Thumb.Style> 
     <Style TargetType="Thumb"> 
      <Setter Property="Template" Value="{StaticResource NodeVisualTemplate}"/> 
      <!--default Template ^--> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding YourProperty}" Value="0"> 
        <Setter Property="Template" Value="{StaticResource TemplateOn0}"/> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding YourProperty}" Value="1"> 
        <Setter Property="Template" Value="{StaticResource TemplateOn1}"/> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding YourProperty}" Value="2"> 
        <Setter Property="Template" Value="{StaticResource TemplateOn2}"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Thumb.Style> 
</Thumb> 

サンプルプロパティの実装:

public int YourProperty {set;get;} = 0; 

また、より簡単にテンプレートがいる、あるいは文字列となっている理解するために、いくつか列挙型を使用することができます。

ListBoxItemのテンプレートを入れ替えたい場合は、ListboxのビルドインItemTemplateSelecetorを使用できます。ここでは、このよう<DataTemplate.Triggers>使用することができsample

+0

私は質問のタイトルを適切に編集しました。 – Clemens