2013-04-25 20 views
8

Daha sonra MainWindow tarafından çağrılacak bir dosyada oluşturduğum bir kılavuzdaki bir liste kutusunda bir ItemTemplateSelector kullanmaya çalışıyorum. İşte Liste Kutusu ItemTemplate Selector bir şablon seçmiyor

ince bağlanma çalışmaları (non-biçimlendirilmiş nesnelerin listesi listesinde görünür halde İşte benim xaml

<Grid x:Class="NS.Views.ListView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:c="clr-namespace:NS.Commons" 
    DataContext="{Binding}"> 
<Grid.Resources> 
    <c:myConverter x:Key="converter" /> 
    <c:TemplateSelector x:Key="borderSelector" /> 
    <DataTemplate x:Key="greenItemTemplate"> 
     <Border BorderThickness="3" BorderBrush="Green"> 
      <StackPanel HorizontalAlignment="Stretch"> 
       <TextBlock Text="{Binding Path=GroupName}"/> 
       <TextBlock Text="{Binding Path=myType}"/> 
      </StackPanel> 
     </Border> 
    </DataTemplate> 
      <DataTemplate x:Key="redItemTemplate"> 
     <Border BorderThickness="3" BorderBrush="Red"> 
      <StackPanel HorizontalAlignment="Stretch"> 
       <TextBlock Text="{Binding Path=GroupName}"/> 
       <TextBlock Text="{Binding Path=myType}"/> 
      </StackPanel> 
     </Border> 
    </DataTemplate> 
    <DataTemplate x:Key="yellowItemTemplate"> 
     <Border BorderThickness="3" BorderBrush="Yellow"> 
      <StackPanel HorizontalAlignment="Stretch"> 
       <TextBlock Text="{Binding Path=GroupName}"/> 
       <TextBlock Text="{Binding Path=myType}"/> 
      </StackPanel> 
     </Border> 
    </DataTemplate> 
</Grid.Resources> 

<ListBox ItemsSource="{Binding myCollectionOfMyClassObjects}" 
     Name="listBox1" 
     HorizontalContentAlignment="Stretch" 
     ItemTemplateSelector="{StaticResource borderSelector}" 
     > 
</ListBox> 

Ancak benim DataTemplateSelector kodu

public class TemplateSelector : DataTemplateSelector 
{ 
    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     FrameworkElement element = container as FrameworkElement; 
     if (element != null && item != null && item is myClass) 
     { 
      myClass agg = item as myClass; 
      if(agg.myType == a) 
      { 
       return element.FindResource("greenItemTemplate") as DataTemplate; 
      } 
      else if (agg.myType == b) 
      { 
       return element.FindResource("yellowItemTemplate") as DataTemplate; 
      } 
      else if (agg.myType == c) 
      { 
       return element.FindResource("redItemTemplate") as DataTemplate; 
      } 
     } 

     return null; 
    } 
} 

olduğunu), ItemTemplateSelector TemplateSelector yöntemlerini çağırmıyor. Yöntemlerin başında bir kırılma noktası koydum ve hiç aramamıştı.

Sorunun ne olabileceğini bilen var mı?

@
+2

BorderBrush sen ne gerek için ne yapabilirim

DataTriggerTemplate

şey gibi kullanılabilir anahtarlama ile ListBoxItemStyle kullanmaktır her zaman yeşildir. –

+0

Yorum için teşekkürler, sorun olmasa da. Tam kodu göndermek istemediğimden beri soruyu yolladım. Tekrar teşekkürler. Düzenlememe izin ver, böylece dikkat dağınıklığı olmadı. – locorecto

+2

'ListBox''un' ItemsSource'unuz yüklendikten sonra değişiyor mu? TemplateSelectors'ın PropertyChanged veya CollectionChanged olaylarına yanıt verdiğini düşünmüyorum - Program bir kez – Rachel

cevap

7
@

@Rachel haklı. Sizin DataTemplateSelector'unuz sadece bir kez yüklendiğinde ve bir kez INPC değişiklikleri için çağrılır.

<ControlTemplate x:Key="greenItemTemplate"> 
    <Border BorderBrush="Green" 
      BorderThickness="3"> 
    <StackPanel HorizontalAlignment="Stretch"> 
     <TextBlock Text="{Binding Path=GroupName}" /> 
     <TextBlock Text="{Binding Path=myType}" /> 
    </StackPanel> 
    </Border> 
</ControlTemplate> 
<ControlTemplate x:Key="redItemTemplate"> 
    <Border BorderBrush="Red" 
      BorderThickness="3"> 
    <StackPanel HorizontalAlignment="Stretch"> 
     <TextBlock Text="{Binding Path=GroupName}" /> 
     <TextBlock Text="{Binding Path=myType}" /> 
    </StackPanel> 
    </Border> 
</ControlTemplate> 
<ControlTemplate x:Key="yellowItemTemplate"> 
    <Border BorderBrush="Yellow" 
      BorderThickness="3"> 
    <StackPanel HorizontalAlignment="Stretch"> 
     <TextBlock Text="{Binding Path=GroupName}" /> 
     <TextBlock Text="{Binding Path=myType}" /> 
    </StackPanel> 
    </Border> 
</ControlTemplate> 
<Style x:Key="MyListBoxItemStyle" 
     TargetType="{x:Type ListBoxItem}"> 
    <Setter Property="Template" 
      Value="{DynamicResource greenItemTemplate}" /> 
    <Style.Triggers> 
    <DataTrigger Binding="{Binding myType}" 
        Value="c"> 
     <Setter Property="Template" 
       Value="{DynamicResource redItemTemplate}" /> 
    </DataTrigger> 
    <DataTrigger Binding="{Binding myType}" 
        Value="b"> 
     <Setter Property="Template" 
       Value="{DynamicResource yellowItemTemplate}" /> 
    </DataTrigger> 
    </Style.Triggers> 
</Style> 

ve kullanım: senin Şablonlar Border

<ListBox ItemContainerStyle="{StaticResource MyListBoxItemStyle}" 
     ItemsSource="{Binding myCollectionOfMyClassObjects}" 
     Name="listBox1" 
     HorizontalContentAlignment="Stretch" /> 
+1

Bu çözüm harika çalışıyor. Zaman ayırdığın için teşekkürler. – locorecto

+1

hoş geldiniz :) – Viv

+1

@ user971602 Yanıtı kabul etmediğinizi görüyorum. onunla bir problem mi var? Merak ediyorum – Viv

İlgili konular