2013-04-25 4 views
8

मैं एक ग्रिड के भीतर एक सूची बॉक्स पर एक आइटम टेम्पलेट चयनकर्ता का उपयोग करने की कोशिश कर रहा हूं जिसे मैं एक अलग फ़ाइल पर बना रहा हूं जिसे बाद में मेनविंडो द्वारा बुलाया जा सकता है।लिस्टबॉक्स आइटम टेम्पलेट चयनकर्ता टेम्पलेट नहीं चुनता

यहाँ मेरी DataTemplateSelector कोड

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; 
    } 
} 

है यहाँ मेरी 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> 

है हालांकि, बंधन ठीक काम करता है (गैर स्वरूपित वस्तुओं की सूची सूची में दिखाई देता है, हालांकि), ItemTemplateSelector टेम्पलेट चयनकर्ता विधियों को कॉल नहीं कर रहा है। मैंने तरीकों की शुरुआत में ब्रेकपॉइंट लगाया और इसे कभी नहीं बुलाया गया।

क्या कोई जानता है कि समस्या क्या हो सकती है?

+2

अपने टेम्पलेट्स सीमा के BorderBrush

आप क्या आवश्यकता के लिए क्या कर सकते हैं DataTrigger स्विचिंग Template इस्तेमाल किया

कुछ तरह के साथ एक ListBoxItemStyle का उपयोग करें हमेशा हरा है। –

+0

टिप्पणी के लिए धन्यवाद हालांकि यह समस्या नहीं है। यह वही तरीका था जिस पर मैंने सवाल पोस्ट किया था क्योंकि मैं सटीक कोड पोस्ट नहीं करना चाहता था। एक बार फिर धन्यवाद। मुझे इसे संपादित करने दें ताकि यह एक व्याकुलता न हो। – locorecto

+2

क्या आपके लिस्टबॉक्स के 'आइटम्स स्रोत' लोड होने के बाद बदलता है? मुझे नहीं लगता कि 'टेम्पलेट चयनकर्ता' ने संपत्तिChanged या CollectionChanged घटनाओं का जवाब दिया - कार्यक्रम का मूल्यांकन तब किया जाता है जब प्रोग्राम – Rachel

उत्तर

7

@ राहेल सही है। आपका DataTemplateSelector केवल लोड पर एक बार बोले जाते हैं और INPC परिवर्तनों के लिए नहीं।

<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> 

और उपयोग:

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

यह समाधान बहुत अच्छा काम करता है। समय के लिए धन्यवाद। – locorecto

+1

आपका स्वागत है :) – Viv

+1

@ user971602 मुझे लगता है कि आपने जवाब अस्वीकार कर दिया है। क्या इसमें कोई समस्या है? उत्सुक – Viv

संबंधित मुद्दे