使用资源中的 DataTemplate-Content

Use DataTemplate-Content from resource

在我的应用程序中,我有一个 HierarchicalDataTemplate 看起来像:

<HierarchicalDataTemplate DataType="{x:Type model:ParentDisplayTreeItem}" ItemsSource="{Binding Children}">
    <CheckBox IsChecked="{Binding IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
        <CheckBox.Content>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="16"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <Image Grid.Column="0" Source="{Binding Image}" VerticalAlignment="Center"/>
                <TextBlock Grid.Column="1" Text="{Binding Display}" VerticalAlignment="Center" Margin="2,1"/>
            </Grid>
        </CheckBox.Content>
    </CheckBox>
</HierarchicalDataTemplate>

还有一个 DataTemplate 看起来像:

<DataTemplate DataType="{x:Type model:ChildDisplayTreeItem}">
    <CheckBox IsChecked="{Binding IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
        <CheckBox.Content>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="16"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <Image Grid.Column="0" Source="{Binding Image}" VerticalAlignment="Center"/>
                <TextBlock Grid.Column="1" Text="{Binding Display}" VerticalAlignment="Center" Margin="2,1"/>
            </Grid>
        </CheckBox.Content>
    </CheckBox>
</DataTemplate>

如您所见,两者具有相同的内容 CheckBox

是否可以将 CheckBox 移动到资源并从那里使用它?

我试过在资源中以 ControlTemplate 的形式提供它,例如:

<ControlTemplate x:Key="CheckBoxControlTemplate">
    <CheckBox IsChecked="{Binding IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
        <CheckBox.Content>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="16"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <Image Grid.Column="0" Source="{Binding Image}" VerticalAlignment="Center"/>
                <TextBlock Grid.Column="1" Text="{Binding Display}" VerticalAlignment="Center" Margin="2,1"/>
            </Grid>
        </CheckBox.Content>
    </CheckBox>
</ControlTemplate>

并像这样使用它:

<HierarchicalDataTemplate DataType="{x:Type model:ParentDisplayTreeItem}" ItemsSource="{Binding Children}">
    <StaticResource ResourceKey="CheckBoxControlTemplate"/>
</HierarchicalDataTemplate>

但是我用这种方法遇到了编译错误。

是的,你可以做到。它应该是这样的。

<HierarchicalDataTemplate DataType="{x:Type model:ParentDisplayTreeItem}" 
                          ItemsSource="{Binding Children}">
    <CheckBox Template="{StaticResource CheckBoxControlTemplate}" />
</HierarchicalDataTemplate>