如何使用代码获取DataTemplate密钥

时间:2013-12-11 07:37:24

标签: c# wpf

我已经创建了一个DataTemplate,如下所示

<DataTemplate x:Key="ScheduleItemPendingTemplate">
    <Grid IsHitTestVisible="False" Background="{StaticResource StatusPendingBrush}">

        <Rectangle Stroke="{StaticResource AppointmentSectionBgActive}"
                   StrokeDashArray="2 1"
                   StrokeThickness="1.5"
                   Fill="{StaticResource DataGridHeaderBackground}" />

        <TextBlock x:Name="txtAppointmentTitleinDefault"
                       Text="{x:Static resource:StringResources.Label_AppointmentStatus_Pending}"

                       HorizontalAlignment="Center"
                       VerticalAlignment="Center"
                       Style="{StaticResource AppointmentDataLabel}" />

    </Grid>
</DataTemplate>

我已使用下面的代码将此模板分配给DataTemplate变量。

public override DataTemplate SelectTemplate(object item, DependencyObject container)
{   
      dataTemplate = AppointmentTemplateResourceDictionary["DefaultTemplate"] as DataTemplate;
      if (//some condition)
      {
          DataTemplate pendingTemplate = AppointmentTemplateResourceDictionary["ScheduleItemPendingTemplate"] as DataTemplate;
      }
      return pendingTemplate;
 }

我如何知道我返回的DataTemplate的名称?

2 个答案:

答案 0 :(得分:1)

如果你已经意识到这一点,我不确定你为什么要在代码中获得x:Keyx:Key将为ScheduleItemPendingTemplate

关于DataTemplateKey,它用于标识DataTemplate DataTypewill be null in case you haven't defined any DataType for your template

<DataTemplate x:Key="ScheduleItemPendingTemplate"
              DataType="StackPanel">
   ....
</DataTemplate>

在上面的情况下,DataTemplateKey不会为空,并会告诉您它的DataType是StackPanel。

此外,无法从代码中获取x:Key。获取的唯一方法是遍历资源键 -

foreach (var resourceKey in this.Resources.Keys)
{

}

如上所述,没有任何内置可以从DataTemplate中获取x:Key。但是您可以在运行时添加资源,并可以访问要获取此名称的Resources(仅限解决方法)

dataTemplate = AppointmentTemplateResourceDictionary["DefaultTemplate"]
                     as DataTemplate;
dataTemplate.Resources["Key"] = "DefaultTemplate";
if (//some condition)
{
   DataTemplate pendingTemplate = 
          AppointmentTemplateResourceDictionary["ScheduleItemPendingTemplate"]
             as DataTemplate;
   pendingTemplate.Resources["Key"] = "ScheduleItemPendingTemplate";
}

你可以在任何你想要的地方访问它 -

string key = dataTemplate.Resources["Key"];

答案 1 :(得分:0)

尝试使用此方法:http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.findresource(v=vs.110).aspx

你内部的代码控制

var = this.FindResource("ResourceKey")