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