Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
[gelöst] Command-Binding bei verschachtelten DataTemplates
Easyrider
myCSharp.de - Member



Dabei seit:
Beiträge: 200
Herkunft: Bayern

Themenstarter:

[gelöst] Command-Binding bei verschachtelten DataTemplates

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Easyrider am .
private Nachricht | Beiträge des Benutzers
winSharp93
myCSharp.de - Experte

Avatar #avatar-2918.png


Dabei seit:
Beiträge: 5.742
Herkunft: Stuttgart

beantworten | zitieren | melden

Zitat von Easyrider
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)?
private Nachricht | Beiträge des Benutzers
Easyrider
myCSharp.de - Member



Dabei seit:
Beiträge: 200
Herkunft: Bayern

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Easyrider
myCSharp.de - Member



Dabei seit:
Beiträge: 200
Herkunft: Bayern

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Hans_Rakete
myCSharp.de - Member



Dabei seit:
Beiträge: 178

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers