2017-06-04 6 views
2

Ich habe zwei ListBoxen in meinem XAML und eine Klasse MyListItem definiert. Nun sollte eine ListBox den Namen als Schaltfläche anzeigen und die zweite ListBox sollte den Namen als TextBlock anzeigen.Zwei verschiedene DataTemplate

Hier ist ein kleines Beispiel, verhalten sich beide ListBoxs gleich.

MyListItem

public class MyListItem 
{ 
    private string _name; 
    public string Name 
    { 
     get{return _name;} 
     set{_name = value;} 
    } 
} 

XAML

<Window xmlns="https://github.com/avaloniaui" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:DataTemplate.Views.MainWindow" 
    xmlns:viewsmodels="clr-namespace:DataTemplate.ViewModels;assembly=DataTemplate" 
    xmlns:dt="clr-namespace:DataTemplate;assembly=DataTemplate" 
    Title="DataTemplate" Width="700"> 
<Window.DataContext> 
    <viewsmodels:MainWindowViewModel /> 
</Window.DataContext>  
<Grid ColumnDefinitions="250,250,250">  
    <ItemsControl Grid.Column="1" Items="{Binding List2}"> 
    <ItemsControl.DataTemplates> 
     <DataTemplate DataType="{x:Type dt:MyListItem}"> 
     <TextBlock Text="{Binding Name}"/> 
     </DataTemplate> 
    </ItemsControl.DataTemplates> 
    </ItemsControl> 
    <ItemsControl Grid.Column="2" Items="{Binding List3}"> 
    <ItemsControl.DataTemplates> 
     <DataTemplate DataType="{x:Type dt:MyListItem}"> 
     <Button Content="{Binding Name}"/> 
     </DataTemplate> 
    </ItemsControl.DataTemplates> 
    </ItemsControl> 
</Grid> 
</Window> 

Viewmode

public class MainWindowViewModel 
{ 
      public ObservableCollection<MyListItem> List1 { get; set; } 
    public ObservableCollection<MyListItem> List2 { get; set; } 
    public ObservableCollection<MyListItem> List3 { get; set; } 

    public MainWindowViewModel() 
    { 
     List1 = new ObservableCollection<MyListItem>(); 
     List2 = new ObservableCollection<MyListItem>(); 
     List3 = new ObservableCollection<MyListItem>(); 

     Random rand = new Random(); 

     for (int i = 0; i < rand.Next(1, 20); i++) 
     { 
      MyListItem mli = new MyListItem(); 
      mli.Name = "ListItem" + i; 
      List1.Add(mli); 
     } 

     for (int i = 0; i < rand.Next(1, 20); i++) 
     { 
      MyListItem mli = new MyListItem(); 
      mli.Name = "ListItem" + i; 
      List2.Add(mli); 
     } 

     for (int i = 0; i < rand.Next(1, 20); i++) 
     { 
      MyListItem mli = new MyListItem(); 
      mli.Name = "ListItem" + i; 
      List3.Add(mli); 
     } 
    } 
} 

Antwort

3

Leider gibt es derzeit in Avalonia keine gute Möglichkeit, das zu tun. Der naheliegendste Weg wäre, die Datenvorlagen zu einer <Style.Resources> Sammlung hinzuzufügen und {StyleResource} zu verwenden, um sie zu referenzieren, aber das funktioniert derzeit nicht.

Ich glaube, Sie haben zwei Alternativen hier für den Augenblick:

  1. Kopieren Sie einfach und die Datenvorlagen in die sie ItemsControl.ItemTemplate
  2. Definieren Sie die Datenvorlagen in Code und Referenz einfügen {Static} verwenden. Hierfür können Sie FuncDataTemplate<>

Ich habe verwenden, um ein Problem hinzugefügt, dieses Problem zu verfolgen hier: https://github.com/AvaloniaUI/Avalonia/issues/1020

+0

Ich habe meinen Code aktualisiert, wie Sie in Punkt 1 gesagt haben, und es funktioniert. I relize Sie einfach schreiben _ItemTemplate_. Was ist der Unterschied zwischen DataTemplate und ItemTemplate? – EinApfelBaum

+0

Der Unterschied ist im Großen und Ganzen der gleiche wie in WPF: 'ItemTemplate' bedeutet„diese Vorlage verwendet unconditonally für jedes Element“, während der Vorlage setzt in' DataTemplates' ist eine Vorlage auf eine Ressource in WPF wie das Hinzufügen von wo es in Abhängigkeit von der gewählt werden Art des Artikels. – Grokys

0

Sie benötigen Items statt List-Box verwenden und haben ItemTemplate unterschiedlich eingestellt für jeden von ihnen.

Man zeigt auf DataTemplate (mit x: Key, nicht DataType) mit TextBlock und das andere auf DataTemplate mit Button.

+0

ich meinen Code aktualisiert. Wie referenziere ich die Window.DataTemplates? Mit StaticResource in der ItemTemplate-Eigenschaft habe ich eine Ausnahme. – EinApfelBaum

+0

Ich habe gerade diesen Teil bemerkt, den Sie "Window.DataTemplates" geschrieben haben. Es soll "Window.Resources" sein. – Mishka

+0

Ich arbeite hier auf Linux mit dotnetcore und AvaloniaUI, nicht WPF. Es gibt keine Window.Resource – EinApfelBaum

Verwandte Themen