views:

130

answers:

1

I am fairly new to WPF and am having trouble getting the DataTemplateKey to find my ListBox.

<Window.Resources>

    <ControlTemplate x:Key="FocusTemplate" >
        <Rectangle Fill="Azure" Width="290" Height="55" />
    </ControlTemplate>
    <Style x:Key="FocusStyle" TargetType="{x:Type Control}">
        <Setter Property="Template" Value="{StaticResource FocusTemplate}"/>
    </Style>

    <Style TargetType="ListBoxItem">
        <EventSetter Event="GotFocus" Handler="ListItem_GotFocus"></EventSetter>
    </Style>

    <DataTemplate DataType="{x:Type TextBlock}">
    </DataTemplate>

    <DataTemplate x:Key="CustomListData" DataType="{x:Type ListBox}">
        <Border BorderBrush="Black" BorderThickness="1" Margin="-2,0,0,-1">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="55*" />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                <Grid.RenderTransform>
                    <TransformGroup>
                        <ScaleTransform ScaleX="1" ScaleY="1"/>
                        <SkewTransform AngleX="0" AngleY="0"/>
                        <RotateTransform Angle="0"/>
                        <TranslateTransform X="0" Y="0"/>
                    </TransformGroup>
                </Grid.RenderTransform>
                <!--<ScrollViewer x:Name="PART_ContentHost" />-->
                <TextBox Width="290" TextAlignment="Left" VerticalContentAlignment="Center" BorderThickness="0" BorderBrush="Transparent"
                                         Foreground="#FF6FB8FD"
                                         FontSize="18"
                                         FocusVisualStyle="{StaticResource FocusStyle}"
                                         Name="editingBox"
                                         TextWrapping="Wrap"
                                         Text="{Binding .}"
                                         Grid.Column="1"
                                         Grid.Row="1"
                                         MinHeight="55"
                                         Cursor="Hand"
                                         IsReadOnly="True"
                                         >
                    <TextBox.Background>
                        <LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
                            <LinearGradientBrush.RelativeTransform>
                                <TransformGroup>
                                    <ScaleTransform CenterX="0.5" CenterY="0.5"/>
                                    <SkewTransform CenterX="0.5" CenterY="0.5"/>
                                    <RotateTransform Angle="0" CenterX="0.5" CenterY="0.5"/>
                                    <TranslateTransform/>
                                </TransformGroup>
                            </LinearGradientBrush.RelativeTransform>
                            <GradientStop Color="#FF2D4984"/>
                            <GradientStop Color="#FF182D56" Offset="0.042"/>
                        </LinearGradientBrush>
                    </TextBox.Background>

                </TextBox>
            </Grid>
        </Border>
    </DataTemplate>

    <Style TargetType="{x:Type ListBox}">
        <Setter Property="ItemTemplate" Value="{StaticResource CustomListData }" />
        <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled" />
    </Style>

  </Window.Resources>

  <Window.DataContext>
    <ObjectDataProvider 
  ObjectType="{x:Type local:ImageLoader}" 
  MethodName="LoadImages" 
  />
  </Window.DataContext>

    <ListBox ItemsSource="{Binding}" Width="320" Background="#FF021422" BorderBrush="#FF1C4B79">

        <ListBox.Resources>
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}">Transparent</SolidColorBrush>
        </ListBox.Resources>

    </ListBox>

The following code will find a TextBlock

var key = new System.Windows.DataTemplateKey(typeof(TextBlock));
var r = (DataTemplate)this.FindResource(key);

However, when I change the type to ListBox, the key can not be found. What have I missed?

Thanks Ryan

+1  A: 

You have given your ListBox DataTemplate a different key, specifically, x:Key="CustomListData". The x:Key attribute will take precedence over the automatic DataTemplateKey that is generated based on the DataType. Delete that key and the automatic DataTemplateKey will be found.

Charlie
Charlie, That works great. But now how would I have this listbox use my custom ItemTemplate. I had to comment out the setter since I no longer have a key.
Ryan
A key-less DataTemplate will be automatically applied to any elements of the same DataType. I am wondering why your CustomListData has its DataType marked as "ListBox" even though it is being applied to ListBoxItems. Perhaps change its DataType to ListBoxItem?
Charlie
Thanks that did the trick!
Ryan