2014-06-16 7 views
0

Я создал 2 шаблона данных и использовал его в качестве ресурса, я применяю его к списку, я могу применить только один шаблон данных в списке, вот код как шаблон данныхКак установить несколько шаблонов данных в список

<Window.Resources> 
     <DataTemplate x:Key="template1"> 
      <Canvas Height="40" Width="850"> 
       <Label Height="30" Width="170" Canvas.Top="5" Canvas.Left="80" Background="LightGray"></Label> 
       <TextBox Height="30" Width="120" Canvas.Top="5" Canvas.Left="300" Background="AliceBlue"></TextBox> 
       <Label Canvas.Left="420" Canvas.Top="5">$</Label> 
      </Canvas> 
     </DataTemplate> 
     <DataTemplate x:Key="template2"> 
      <Canvas Height="40" Width="850"> 
       <Label Height="30" Width="200" Canvas.Top="5" Canvas.Left="80" Background="LightGray"></Label> 
       <TextBox Height="30" Width="200" Canvas.Top="5" Canvas.Left="300" Background="AliceBlue"></TextBox> 
       <Label Canvas.Left="420" Canvas.Top="5">$</Label> 
      </Canvas> 
     </DataTemplate> 
      </Window.Resources> 

и код для ListBox

<TabItem> 
     <Canvas Height="700" Width="850"> 
      <ListBox x:Name="listBox" Height="700" Width="850" ItemTemplate="{StaticResource template1}"> 
      </ListBox> 
     </Canvas> 
    </TabItem> 

как я могу применить и шаблоны данных в ListBox, в настоящее время только «template1» становится прикладной, как может «template2» или если в будущем будет много шаблонов данных. Есть ли какой-либо способ?, thanx

+0

Что на самом деле нужно? У вас не может быть 2 DataTemplates для одного объекта? Вы хотите, чтобы шаблон применялся на основе какого-либо условия? –

+0

У меня есть список, в котором я хочу отобразить несколько шаблонов данных, содержащих метки и текстовые поля. – Safwan

+1

DataTemplate - это способ визуализации ваших данных. Где вы устанавливаете ItemsSource ListBox? DataTemplate можно переключать на основе некоторого условия, но вы не упомянули никаких условий в своем вопросе. Однако вы можете применять несколько DataTemplates с помощью DataTemplateSelector. –

ответ

1

Вы можете использовать несколько DataTemplates с помощью DataTemplateSelector и DataTrigger но нету объяснения каких-либо условий (выбранный элемент, невыбранный элемент, индекс, изменения переднего плана и размер шрифта и т.д.)

Это кажется, что вы хотите шаблон для отображения цели/UI цель только тогда вам нужно изменить шаблон для каждого ListBoxItem, как показано ниже

<Window.Resources> 
    <ControlTemplate x:Key="template1"> 
     <Canvas Height="40" Width="850"> 
      <Label Height="30" Width="170" Canvas.Top="5" Canvas.Left="80" Background="LightGray"></Label> 
      <TextBox Height="30" Width="120" Canvas.Top="5" Canvas.Left="300" Background="AliceBlue"></TextBox> 
      <Label Canvas.Left="420" Canvas.Top="5">$</Label> 
     </Canvas> 
    </ControlTemplate> 
    <ControlTemplate x:Key="template2">   
     <Canvas Height="40" Width="850"> 
      <Label Height="30" Width="200" Canvas.Top="5" Canvas.Left="80" Background="LightGray"></Label> 
      <TextBox Height="30" Width="200" Canvas.Top="5" Canvas.Left="300" Background="AliceBlue"></TextBox> 
      <Label Canvas.Left="420" Canvas.Top="5">$</Label> 
     </Canvas>  
    </ControlTemplate>  
</Window.Resources> 
<Grid> 
    <TabControl> 
     <TabItem> 
      <Canvas Height="700" Width="850"> 
       <ListBox x:Name="listBox" Height="700" Width="850"> 
        <ListBoxItem Template="{StaticResource template1}"></ListBoxItem> 
        <ListBoxItem Template="{StaticResource template2}"></ListBoxItem> 
       </ListBox> 
      </Canvas> 
     </TabItem> 
    </TabControl> 
</Grid> 
+0

У меня есть xml-файл, который содержит много задач, есть общая задача 11, которая хочет привязать задачу к метке, например. task1 до метки шаблона1, метки task2 - template2, task3 - метки шаблона ... и так далее. – Safwan

1

вы пробовали ItemsControl.ItemTemplateSelector Property ItemTemplateSelector

ниже у меня есть очень простой пример из списка Студента в ListBox связанного приложения и для студента, имеющего Отмечает менее чем на 50 процентов у меня есть Template2 и для других я выбрал template1

Вид

<Window.Resources> 
    <local:StudentDataTemplateSelector x:Key="studentDataTemplateSelector"/> 
    <DataTemplate x:Key="template1"> 
     <StackPanel Orientation="Horizontal" Background="LightGray"> 
      <TextBlock Text="{Binding RollNo}" Margin="5"/> 
      <TextBlock Text="{Binding Name}" Margin="5"/> 
      <TextBlock Text="{Binding Percentage}" Margin="5"/> 
     </StackPanel> 
    </DataTemplate> 
    <DataTemplate x:Key="template2"> 
     <StackPanel Orientation="Horizontal" Background="Red"> 
      <TextBlock Text="{Binding RollNo}" Margin="5"/> 
      <TextBlock Text="{Binding Name}" Margin="5"/> 
      <TextBlock Text="{Binding Percentage}" Margin="5"/> 
     </StackPanel> 
    </DataTemplate> 
</Window.Resources> 
<Grid> 
    <ListBox x:Name="listBox" Height="700" Width="850" ItemsSource="{Binding Students}" 
      ItemTemplateSelector="{StaticResource studentDataTemplateSelector}"> 
    </ListBox> 
</Grid> 

xaml.cs

public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = new ViewModel(); 
    }  

ViewModel/Student

public class ViewModel 
{ 
    public ObservableCollection<Student> Students { get; set; } 

    public ViewModel() 
    { 
     Students = new ObservableCollection<Student>{new Student{Name="ABC",RollNo=1,Percentage=86.5m}, 
      new Student{Name="DEF",RollNo=2,Percentage=76.5m}, 
      new Student{Name="GHI",RollNo=3,Percentage=66.5m}, 
      new Student{Name="JKL",RollNo=4,Percentage=56.5m}, 
      new Student{Name="MNO",RollNo=5,Percentage=46.5m}, 
      new Student{Name="PQR",RollNo=6,Percentage=36.5m}, 
     }; 
    } 

} 

public class Student 
{ 
    public string Name { get; set; } 
    public int RollNo { get; set; } 
    public decimal Percentage { get; set; } 
} 

ItemTemplateSelector

public class StudentDataTemplateSelector : DataTemplateSelector 
{ 
    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     FrameworkElement element = container as FrameworkElement; 

     var student = item as Student; 
     if (student == null) 
      return null; 
     if (student.Percentage > 50) 
      return 
       element.FindResource("template1") 
       as DataTemplate; 
     else 
      return 
       element.FindResource("template2") 
       as DataTemplate; 
    } 
} 

Надеюсь, это даст вам представление.

+0

thanx для вашего ответа, теперь у меня есть идея, но у меня нет каких-либо условий, я просто хочу привязать содержимое своего xml-файла к каждой метке в шаблоне, есть общая задача 11, нужно связать задачу с меткой для например. task1 to template1 label, task2 to template2 label, task3 to template3 label ...и так далее. – Safwan

 Смежные вопросы

  • Нет связанных вопросов^_^