【问题标题】:how to get the element's Property to which a DataTemplate is applied如何获取应用 DataTemplate 的元素的属性
【发布时间】:2014-08-22 08:17:54
【问题描述】:

我根据元素的属性将不同的 DataTemplates 应用于相同类型的元素(实际上是具有日期时间和一些其他属性的事件)。

该元素实际上是 Telerik 的 RadTimeline。

数据模板如下

    <DataTemplate x:Key="eventXTemplate">
            <Border Width="10" Height="10" Margin="0,0,0,5">
                <Rectangle Height="7"
                Width="7"
                HorizontalAlignment="Center"
                VerticalAlignment="Center"
                Fill="X" // different fill colors depending on event type
                Cursor="Hand"             
                MouseLeftButtonDown="Event_Clicked">
                    <Rectangle.RenderTransform>
                        <RotateTransform Angle="45">
                        </RotateTransform>
                    </Rectangle.RenderTransform>
                </Rectangle>
            </Border>
        </DataTemplate>

现在想在Event_Clicked 方法中访问元素的日期时间属性。它如何访问它,因为我得到的发件人是矩形类型。

--编辑-

    <local:CustomItemTemplateSelector x:Key="ItemTemplateSelector"
                                    EventATemplate="{StaticResource eventATemplate}"
                                    EventBTemplate="{StaticResource eventBTemplate}"/>

    namespace timelineControl
    {
     public class CustomItemTemplateSelector : DataTemplateSelector
    {
    public DataTemplate EventATemplate { get; set; }
    public DataTemplate EventBTemplate { get; set; }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        TimelineDataItem data = item as TimelineDataItem;
        items timelineItem = new items();

        if (data == null)
            timelineItem = item as items;
        else
            timelineItem = data.DataItem as items;

        if (timelineItem == null)
            return base.SelectTemplate(item, container);

        switch (timelineItem.Eventtype)
        {
            case "1": return this.EventATemplate;
            default: return this.EventBTemplate;
        }
    }
   }

【问题讨论】:

    标签: c# wpf telerik wpf-controls datatemplate


    【解决方案1】:

    您可能想尝试从RectangleDataContext 获取它:

    var dc = ((Rectangle)sender).DataContext;
    

    【讨论】:

    • 尝试这个时你在 dc variabel 中得到的实际类型是什么?
    • 它的类型是 Telerik.windows.controls.Timeline.TimeLineDataItem。它工作。是我做错了什么。
    • 所以您可以将其转换为正确的类型并能够访问 datetime 属性,不久您确认问题解决了吗?
    • 是的,我可以转换为正确的类型并访问 datetime 属性。谢谢。
    【解决方案2】:

    您可以使用 Blend 中的交互/交互。为了做到这一点 Tools -> Library Package Manager -> Console Package Manager 并粘贴 Install-Package System.Windows.Interactivity.WPF 然后添加命名空间

    xmlns:ic="http://schemas.microsoft.com/expression/2010/interactions"
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    

    在 Rectangle 中,您可以执行以下操作

       <Rectangle ...> 
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="MouseLeftButtonDown">
                    <i:InvokeCommandAction Command="{Binding Event_Clicked}" CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=RadTimeline}, Path=SomeKindOfProperty}"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </Rectangle>
    

    【讨论】:

    • PresentationFramework.dll 中发生了“System.Windows.Markup.XamlParseException”类型的第一次机会异常附加信息:“在“System.Windows.Markup.StaticResourceHolder”上提供值引发了异常。行号“102”和行位置“14”。上面CustomTemplateSelector的代码我已经给出了。
    • 错误与一些静态资源引用有关。检查您的 CustomItemTemplateSelector 是否未在 eventATemplate 和 eventBTemplate 之前创建。 StaticResource 要求之前创建的资源。
    猜你喜欢
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    • 2015-07-31
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多