在WPF中控制模板和数据模板之间的区别是什么?


当前回答

控制模板-改变元素的外观。例如,按钮可以包含图像和文本

DataTemplate——使用元素表示底层数据。

其他回答

以上所有的答案都很棒,但有一个关键的区别被忽略了。这有助于更好地决定何时使用什么。它是ItemTemplate属性:

DataTemplate is used for elements that provide ItemTemplate property for you to replace its items' content using DataTemplates you define previously according to bound data through a selector that you provide. But if your control does not provide this luxury for you then you still can use a ContentView that can display its content from predefined ControlTemplate. Interestingly, you can change the ControlTemplate property of your ContentView at runtime. One more thing to note that unlike controls with ItemTemplate property, you cannot have a TemplateSelector for this (ContentView) control. However, you still can create triggers to change the ControlTemplate at runtime.

控制模板-改变元素的外观。例如,按钮可以包含图像和文本

DataTemplate——使用元素表示底层数据。

基本上,ControlTemplate描述了如何显示控件,而DataTemplate描述了如何显示数据。

例如:

标签是一个控件,它将包括一个控制模板,该控制模板表示标签应该在一些内容(数据模板或其他控件)周围使用边框显示。

一个客户类是数据,将显示使用一个DataTemplate,可以说显示客户类型为一个包含两个textblock的StackPanel,一个显示名称,另一个显示电话号码。这可能是有帮助的注意,所有的类都显示使用DataTemplates,你将通常使用默认模板,这是一个TextBlock的文本属性设置为对象的ToString方法的结果。

ControlTemplate:表示控件样式。

DataTemplate:表示数据样式(您希望如何显示数据)。

所有控件都使用可以通过template属性重写的默认控件模板。

例如 按钮模板是控件模板。 按钮内容模板是一个数据模板

<Button   VerticalAlignment="Top" >
    <Button.Template>
        <ControlTemplate >
            <Grid>
                <Rectangle Fill="Blue" RadiusX="20" RadiusY="20"/>
                <Ellipse Fill="Red" />
                <ContentPresenter Content="{Binding}">
                    <ContentPresenter.ContentTemplate>
                        <DataTemplate>
                        <StackPanel Orientation="Horizontal" Height="50">
                            <TextBlock Text="Name" Margin="5"/>
                                <TextBox Text="{Binding UserName, Mode=TwoWay}" Margin="5" Width="100"/>
                            <Button Content="Show Name" Click="OnClickShowName" />
                        </StackPanel>
                    </DataTemplate>
                    </ContentPresenter.ContentTemplate>
                </ContentPresenter>
            </Grid>
        </ControlTemplate>
    </Button.Template>
</Button>

public String UserName
{
    get { return userName; }
    set
    {
        userName = value;
        this.NotifyPropertyChanged("UserName");
    }
}

ControlTemplate定义视觉外观,dattemplate替换数据项的视觉外观。

示例:我想显示一个按钮从矩形到圆形的形式=>控制模板。

如果控件有复杂的对象,它只调用并显示ToString(),使用DataTemplate,您可以获得各种成员并显示和更改数据对象的值。