2012-07-13 32 views
2

我想要的東西類似於要求的內容here - 但是,我需要模板依賴於屬性的值,這是一個枚舉值。不同的DataTemplate取決於屬性的枚舉值

類看起來simlar這樣:

class ResultBlock 
{ 
    public string Name { get; set; } 
    public BlockType Type { get; set; } 
    public IList<ResultBlock> ChildBlocks { get; private set; } 
} 

BlockType有三個不同的值,BLOCK, FILE, FOLDER - 現在,我想創建一個數據模板來呈現不同的,這取決於什麼樣的價值ResultBlock.Type在當前對象。

我試着用DataType=這樣做,但這顯然不起作用。我敢肯定,只有在XAML中可以很容易地做到這一點。

<TreeView.Resources> 
    <HierarchicalDataTemplate DataType="{x:Type docom:ResultBlock}" ItemsSource="{Binding ChildBlocks}"> 
     <StackPanel Orientation="Horizontal"> 
      <StackPanel.Resources> 
       <DataTemplate DataType="{x:Type docom:BlockType.BLOCK}"> 
        <TextBlock Text="BLOCK:{Binding Name}" /> 
       </DataTemplate> 
      </StackPanel.Resources> 
     </StackPanel> 
    </HierarchicalDataTemplate> 
</TreeView.Resources> 
+0

如果只有「BLOCK:」前綴發生更改,您可以簡單地將「TextBlock」綁定到該「BlockType」屬性。 – 2012-07-24 14:19:22

回答

4
<Window.Resources> 
    <local:TaskListDataTemplateSelector x:Key="myDataTemplateSelector"/> 
</Window.Resources> 
<Grid> 
    <ListBox Width="400" Margin="10" 
    ItemsSource="{Binding Source={StaticResource myTodoList}}" 
    ItemTemplateSelector="{StaticResource myDataTemplateSelector}" 
    HorizontalContentAlignment="Stretch"/> 
</Grid> 
public class TaskListDataTemplateSelector : DataTemplateSelector 
{ 
    public override DataTemplate 
     SelectTemplate(object item, DependencyObject container) 
    { 
     FrameworkElement element = container as FrameworkElement; 

     if (element != null && item != null && item is Task) 
     { 
      Task taskitem = item as Task; 

      if (taskitem.Priority == 1) 
       return 
        element.FindResource("importantTaskTemplate") as DataTemplate; 
      else 
       return 
        element.FindResource("myTaskTemplate") as DataTemplate; 
     } 

     return null; 
    } 
} 

這對於ListBox中實現,但這個想法可能是相同的數據網格/ TreeView。我希望這會有所幫助。

1

一種方法是使用TemplateSelector並在選擇器內根據您的BlockType執行所需操作。

或你創建了wrapperviewmodels:

public class ResultBlockBlock{} 
public class ResultBlockFile{} 
public class ResultBlockFolder{} 

,那麼你可以去的DataTemplate數據類型的方式

5

可以觸發屬性,例如:

<HierarchicalDataTemplate DataType="{x:Type docom:ResultBlock}" 
          ItemsSource="{Binding ChildBlocks}"> 
    <ContentControl Content="{Binding}"> 
     <ContentControl.Style> 
      <Style TargetType="ContentControl"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding BlockType}" Value="BLOCK"> 
         <Setter Property="ContentTemplate"> 
          <Setter.Value> 
           <DataTemplate> 
            <!-- Data template for BLOCK blocks --> 
           </DataTemplate> 
          </Setter.Value> 
         </Setter> 
        </DataTrigger> 
        <!-- More triggers --> 
       </Style.Triggers> 
      </Style> 
     </ContentControl.Style> 
    </ContentControl> 
</HierarchicalDataTemplate> 

是的,這是冗長。 (您可以將不同類型的模板定義爲鍵控資源,然後在Setters中引用它們)

+1

沒有爲我工作。引發以下XamlParseException: 試圖添加到Setter中,該Setter不是集合或者具有TypeConverter。 – 2014-06-18 19:15:52

+0

@HankSchultz:你顯然做錯了什麼,聽起來很像是一個語法錯誤。也許像缺少''標籤?很難說沒有確切的代碼。 – 2014-06-19 03:03:40

+1

也許,但我沒有發現任何明顯的錯誤。我使用樣式觸發器結束了基於期望的屬性值設置Visibility屬性,它具有相同的可見效果。 – 2014-06-25 13:53:01