【问题标题】:wpf Get object type in xaml triggerswpf在xaml触发器中获取对象类型
【发布时间】:2013-05-02 15:02:17
【问题描述】:

我经常使用依赖于本地类类型的触发器。常见的情况是通用控件样式,它们具有依赖于类的 ContentControl。 场景:

1) 实现列表框“MyUserControl”的用户控件

2) 一种大型列表框样式,适用于用户控件内的列表框控件。该样式有一个最初为空的 ContentControl(填充有 Label / StackPanel)

<ContentControl Name="SpecificLabel"></ContentControl>

3) 为每个特定的派生类定义了 Contentcontrols

<ControlTemplate x:Key="listbox1Template">
    <Label...
</ControlTemplate>

<ControlTemplate x:Key="listbox2Template">
    <StackPanel...
</ControlTemplate>

4) 根据MyListboxControl的派生类,Datatriggers选择contentcontrol的模板:

<DataTrigger Binding="{Binding ElementName=MyUserControl, Path=DataType}" Value="{x:Type local:MyListbox1}">
    <Setter TargetName="SpecificLabel" Property="Template" Value="{StaticResource listbox1template}"/>
</DataTrigger>

<DataTrigger Binding="{Binding ElementName=MyUserControl, Path=DataType}" Value="{x:Type local:MyListbox2}">
    <Setter TargetName="SpecificLabel" Property="Template" Value="{StaticResource listbox2template}"/>
</DataTrigger>

因此,基类提供了一个 DataType 属性:

public Type DataType
{
    get
    {
        return this.GetType();
    }
}

这看起来一定有更简单的方法。是否可以仅在 XAML 中获取本地类型,而不使用此属性?

【问题讨论】:

    标签: wpf triggers datatrigger


    【解决方案1】:

    我会使用DataTemplate.DataType 属性并让 WPF 完成工作。没有触发器,没有额外的 DataType 属性。

    <DataTemplate DataType="{x:Type local:MyListbox1}">
        <Label...
    </DataTemplate>
    

    【讨论】:

    • 在上面的示例中,我使用了一个空的 ContentControl,并通过数据触发器插入模板。那么我不清楚的是:您将如何以列表框样式插入此数据模板?
    • ...另外,我不想编写 c# 编码的模板选择器。那么秘诀是什么?
    • 您不需要模板选择器。每次 WPF 必须显示您的本地类之一时,它将使用指定的 DataTemplate。我不知道您的代码,但在您的情况下,我假设您可以将 ContentControl.Content 与 {Binding} 绑定,并根据 this 的类型,它应该选择正确的列表框 DataTemplate。
    • 听起来很有道理。但是 Content={Binding} 不会完成这项工作。我试图设置“模板”或“内容模板”属性。这总是需要一个选择器! please see this one 它显示了我没有得到的问题。能否提供一段代码?
    • 也许你可以先简化你的代码。为您的 local:MyListbox 类添加两个具有不同样式列表框的 DataTemplates 到 UserControl.Resources 并将您的数据绑定到 UserControl 中的 ContentControl 就足够了。如果没有 DataTemplates,它应该只显示类名,如本例 A Guided Tour of WPF – Part 4 (参见 Without a DataTemplate 部分)。如果不是,您的绑定不正确。但是使用 DataTemplates,ContentControl 知道如何呈现您的类。
    猜你喜欢
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 2017-02-09
    • 2015-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多