2

ここで尋ねられたものに似たものが 必要ですが、列挙型であるプロパティの値に依存するテンプレートが必要です。

クラスはこれに似ています:

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

ここでBlockType、3つの異なる値があります。-次に、現在のオブジェクトの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>
4

3 に答える 3

8

プロパティでトリガーできます。例:

<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

于 2012-07-24T14:16:14.590 に答える
6
<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に実装されていますが、DataGrid/TreeViewの考え方も同じです。これがお役に立てば幸いです。

于 2012-07-13T07:34:05.537 に答える
1

1つの方法は、TemplateSelectorを使用し、セレクター内でBlockTypeに応じて必要な処理を実行することです。

または、次のようなラッパービューモデルを作成します。

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

次に、DataTemplateDataTypeの方法で実行できます

于 2012-07-13T07:22:03.750 に答える