2017-09-06 66 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

您可以使用<DataTemplate.Triggers>这样的:

<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

是的,你的“拇指”是你想绑定的元素 – 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> 

样品的属性Implementation:

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

你也可以使用一些枚举,以更易于了解哪些模板是,甚至是字符串。

如果您只想交换ListBoxItem的模板,您可以使用Listbox的内置ItemTemplateSelecetor。这里是sample

+0

好吧,我已经适当地编辑了问题标题。 – Clemens