Laden...

[gelöst] Command-Binding bei verschachtelten DataTemplates

Erstellt von Easyrider vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.418 Views
E
Easyrider Themenstarter:in
200 Beiträge seit 2006
vor 12 Jahren
[gelöst] Command-Binding bei verschachtelten DataTemplates

Hallo,

ich habe aktuell ein Problem mit verschachtelten DataTemplates und Command-Binding und finde einfach keine Lösung. Folgende Problemstellung:

In meiner View habe ich einen TemplateSelector, der mir je nach Einstellung eines von drei verschiedenen Grids anzeigt. Die Grids liegen somit in einem DataTemplate. Innerhalb eines Grids muss ich nun eine Spalte anzeigen, welche wiederum ein eigenes DataTemplate hat. In diesem DataTemplate liegt nun ein Control, das einen Command aus dem ViewModel ausführen soll.

Der DataContext der Grids ist an das ViewModel gebunden. Leider reicht das aber nicht. Der Command bzw. das Command-Binding wird nie aufgerufen. Egal welche Lösung ich probiere. Folgende Dinge bin ich schon durch:

  • DataContext innerhalb des DataTemplates noch einmal setzen (per ElementName mit Grid und TemplateSelector)
  • Command via normales Binding setzen
  • Command via RelativeSource=RelativeSource TemplatedParent setzen
  • Command via ElementName (Grid + TemplateSelector) setzen

Bei Google habe ich heute bestimmt schon eine Stunde gesucht. Hat jemand eine Idee, wie ich das Problem lösen könnte? Es muss doch eine Lösung dafür geben... Wahrscheinlich seh ich nur den Wald vor lauter Bäumen nicht mehr.

mfg

Easy

5.742 Beiträge seit 2007
vor 12 Jahren

Der Command bzw. das Command-Binding wird nie aufgerufen.

Welche Art von Command verwendest du?
DelegateCommand (oder vergleichbares ICommand, das den Code direkt ausführt) oder ein Routed(UI)Command?

Erstere Variante in Verbindung mit folgendem sollte eigentlich immer funktionieren:


<Button Command="{Binding Path=MyCommand}" />

Kannst du auf andere Properties des DataContext zugreifen (z.B. via Binding an die Content-Property des Buttons)?

E
Easyrider Themenstarter:in
200 Beiträge seit 2006
vor 12 Jahren

Hallo winsharp93,

wir verwenden bei unserem Projekt eine vergleichbare Implementierung von ICommand. Diese wurde bereits über hundert Mal benutzt, da vermute ich keine Probleme.

Wenn ich anstatt eines Buttons eine Checkbox hinbaue und das IsChecked={Binding IsSelected} setze, dann geht das. Selbst wenn noch das Command dabei steht. Aber mehr leider auch nicht. Der Command wird wieder nicht ausgeführt.

Folgende Ideen hatte ich noch über Nacht, aber die muss ich noch überprüfen:

  • Das DataGrid registriert die Commands und bearbeitet sie, somit bekomme ich sie nie.
  • Die Checkbox selbst registriert das Click-Command und behandelt es.

Werds mir heute Vormittag nochmal genauer angucken.

E
Easyrider Themenstarter:in
200 Beiträge seit 2006
vor 12 Jahren

Hallo,

ich beantworte mir meine Frage mal selbst, falls andere das Problem auch noch haben.

Das DataGrid kann anscheinend keine Bindings per ElementName auf einzelne Einträge in einer Row. Man kann das Problem umgehen, indem man einen DataContextProxy benutzt. Die vollständige Lösung dazu findet ihr hier.

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;

namespace JobPlan.Controls
{
    public class DataContextProxy : FrameworkElement
    {
        public DataContextProxy()
        {
            this.Loaded += new RoutedEventHandler(DataContextProxy_Loaded);
        }

        void DataContextProxy_Loaded(object sender, RoutedEventArgs e)
        {
            Binding binding = new Binding();
            if (!String.IsNullOrEmpty(BindingPropertyName))
            {
                binding.Path = new PropertyPath(BindingPropertyName);
            }
            binding.Source = this.DataContext;
            binding.Mode = BindingMode;
            this.SetBinding(DataContextProxy.DataSourceProperty, binding);             
        }

        public Object DataSource
        {
            get { return (Object)GetValue(DataSourceProperty); }
            set { SetValue(DataSourceProperty, value); }
        }

        public static readonly DependencyProperty DataSourceProperty =
            DependencyProperty.Register("DataSource", typeof(Object), typeof(DataContextProxy), null);


        public string BindingPropertyName { get; set; }

        public BindingMode BindingMode { get; set; }
        
    }
}

Sobald man diese Klasse in den StaticResources einbaut und die Property mit Binding Source={StaticResource DataContextProxy},Path=DataSource.MeineProperty anspricht, dann gehts.

Was ich mich noch frage ist, warum es im DataGrid nicht geht. Das konnte ich leider noch nicht beantworten. Falls jemand die Antwort weiß, würde ich mich freuen wenn Sie mir jemand beantwortet.

mfg

Easy

H
178 Beiträge seit 2011
vor 12 Jahren

Hallo,

habe gerade ein ähnliches Problem im DataGrid, hier möchte ich aus einem DataTemplate welches im RowDetaiView angezeigt wird ein Command nutzen welches das DataGrid beeinflusst. Die angegebene Lösung hab ich schon mal ausprobiert, bisher leider ohne Erfolg.

Hast du es auch schon "andersrum" probiert?

Viele Grüße.