Laden...

[erledigt] DataGridView: CellTemplate im Code austauschen?

Erstellt von Seikilos vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.217 Views
S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 12 Jahren
[erledigt] DataGridView: CellTemplate im Code austauschen?

Hallo,

ich hab ein DGV welches Zeilen hat, deren letzte Spalte ein Template ist. Default DataTemplate ist ein Label, was quasi als Platzhalter dient.
Nun möchte ich für eine bestimmte Reihe das Template austauschen (z.B. Button)

Ist dies möglich? Die Idee ist, dass jede Reihe gemäß einem Kontext entweder in der Template Spalte als Button, Image, usw repräsentiert wird.

Über dgv.Columns[n].GetCellContent bekomme ich zwar das FrameworkElement, aber ich glaube, ich bin viel zu tief drin. Ich kann bei diesem Element nicht mehr das CellTemplate ändern.

Ich bin mir relativ sicher, dass hier meine alten Konzepte von WinForms Probleme bereiten.
Es geht mir hier nicht um einen TemplateSelector. Sprich das Template soll generisch erzeugt werden und nicht bereits in XAML vordefiniert werden.

Life is a short

3.430 Beiträge seit 2007
vor 12 Jahren

Hallo Seikilos,

ja das kannst du machen.
Ich vermute mal dass du das DataGrid verwendest, denn das DGV ist von WinForms.

Jedenfalls kannst du dir entweder über einen TemplateSelector das passende Template laden lassen.
Oder du machst es noch einfacher in dem du einfach das passende DataTemplate zu dem jeweiligen DatenTyp laden (also einfach ein DataTemplate für den bestimmten DatenTyp in den Resource definieren, dann wird dieses automatisch geladen)

Guck dir mal das hier an: DataGrid Feature walktrough

Gruß
Michael

S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 12 Jahren

Hallo,
danke für den Hinweis. Ich meine tatsächlich DG von WPF und nicht das alte WinForms Ding 😄

Etwas zum Hintergrund: Jede Zeile stellt eine Variable dar, auf der gearbeitet wird.
Es kann jetzt sein, dass eine Variable durch einen Slider oder durch einen Button bedient werden soll.
Welches Bedienelement es sein soll, wird vom Benutzer festgelegt.

Sprich das DG wird aufgebaut mit den Variablen und die eine Template Spalte mit den Controls ist leer.
Der User wählt für eine Variable nun Typ "Button" und der Button soll dann in der jeweiligen Spalte auftauchen.
Ich würde die Templates ungerne in XAML definieren, weil diese Controls über Plugins reingeladen werden sollen.
Es gibt dann irgendwo eine BoolControl.GenerateDataTemplate(), welches mir ein Template zurück gibt.

Womit ich auch nach der Lektüre des Links habe, ist das manuelle selektieren.

Ich habe 3 Spalten und ein Data-Binding auf die ersten zwei. An den CellContent komme ich nun zwar, wie oben erwähnt dran, aber mir fehlt das letzte bisschen, um im Code für eine beliebige Zeile das DataTemplate auszutauschen.

Life is a short

S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 12 Jahren

Habe die Lösung.

Mein TemplateColumn, was variabel sein soll, hat jetzt doch einen TemplateSelector bekommen

 <wpft:DataGridTemplateColumn CellTemplateSelector="{StaticResource ModifierSelector}" Header="Modifier" />

In Resources:

 <DataTemplate x:Key="NoModifierTemplate">
            <Label Content="No Modifier" FontStyle="Italic" />
        </DataTemplate>
        
        <InterfaceSimulator:PropertyDataTemplateSelector x:Key="ModifierSelector" NoModifierTemplate="{StaticResource NoModifierTemplate}" />

Mein DataBinding hat eine zusätzliche Spalte bekommen, die angibt, welcher Modifier nun gerade aktiv ist. Ich habe also das DataBinding erweitert.

Die PropertyDataTemplateSelector Klasse:

 public class PropertyDataTemplateSelector : DataTemplateSelector
   {
      public DataTemplate NoModifierTemplate { get; set; }
     
      public override DataTemplate SelectTemplate(object item,
                 DependencyObject container)
      {
         var i = item as MyType;
         if (i == null)
         {
            return base.SelectTemplate(item, container);
         }

         if (i.Modifier == null)
         {
            return NoModifierTemplate;
         }

         return i.Modifier.RenderDataTemplate();

      }
   }
 

Der Modifier return eine, wie auch immer gerartete DataTemplate Instanz mit eigenen Callbacks, usw.

Life is a short