doppelter DataContext benötigt [gelöst]

  • WPF MVVM

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    doppelter DataContext benötigt [gelöst]

    Hallo Freunde der WPF-/XAML-Programmierung.

    Ich habe ein UserControl (UCL) mit einem Button. Dieser soll per Binding die Name-Property des UCL-DataContexts anzeigen. Der Button soll aber auch einen Command ausführen. Wie binde ich diesen an? So geht es natürlich nicht, weil dann das Programm nicht mehr weiß, dass Name vom UCL-DataContext herstammt.

    XML-Quellcode

    1. <Border Name="Border" BorderBrush="Silver" BorderThickness="1">
    2. <Button Content="{Binding Name}" Command="{Binding MyCommand}" CommandParameter="{Binding DataContext, ElementName=Border}">
    3. <Button.DataContext>
    4. <local1:MyCommandClass />
    5. </Button.DataContext>
    6. </Button>
    7. </Border>


    So geht es auch nicht, da dann nur Border im Button drinsteht: <Button Content="{Binding Name, ElementName=Border}" …

    btw: Gibt es eine Kurzschreibweise (Attributschreibweise) für den Button-DataContext? Ich bekomm es nicht hin.

    ##########

    Argh. Hab's rausgefunden - auch wenn ich nicht weiß, ob das jetzt hier alles so state of the coding art ist:

    XML-Quellcode

    1. <Button Content="{Binding DataContext.Name, ElementName=Border}"

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Hallo,
    sieht mir irgendwie komisch aus.
    Wo bekommt das UC denn den DataContext her?
    wenn der DataContext ein ViewModel ist, haben alle Elemente im UC zugriff auf die Properties des VM.
    Wenn das Property im Codebehind sitzt, dann kannst auch mit RelativeSource und FindAncestor arbeiten.
    Also wichtig zu wissen wäre, was ist der DataContext und wo wird dieser gebunden.
    "Hier könnte Ihre Werbung stehen..."
    Denk ich mir, dass das komisch aussieht. Bin erst seit kurzer Zeit in der WPF unterwegs.
    Das UC hat als DataContext ein ViewModel. Daher hat der Border diesen ebenfalls. Da ich aber dann einen lokalen DataContext (aus Unwissenheit, wie es besser geht) für den Button setze, damit der Command aus einem anderen Namespace erreichbar ist, wusste ich mir erstmal nicht anders zu behelfen.
    Im ViewModel, welches dem UC als DataContext vorliegt, gibt es eben u.a. die String-Property Name, die in dem einen Button des UCs angezeigt werden soll. Das VM liegt im Namespace ViewModels. Der Command liegt im Namespace MainWindow mit dem Alias local1, also

    XML-Quellcode

    1. xmlns:local="clr-namespace:ViewModels;assembly=ViewModels" xmlns:local1="clr-namespace:MainWindow"

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    Ah Ok.
    aber der Button ansich brauch eigentlich keinen Datenkontext.
    Einfach im ViewModel den Command registrieren und dann kannst darauf zugreifen.
    ich kann dir nachher ein Beispiel machen.



    Hab Dir mal ein kleines Beispiel gemacht. VBP_UC_CommandTest.zip

    Es gibt das MainWindow mit einem MainViewModel.
    Das MainViewmodel hat ein Property von UcTestViewModel welches im Konstruktor initialisiert wird.
    Im MainWindow wird das UC in Row 2 hinzugefügt und der Datenkontext des UC auf das Property im MainViewModel gebunden.
    Somit haben alle Elemente im UC Zugriff auf die Properties im UcTestViewModel
    Im Uc habe ich als Beispiel einen Textblock und einen Button.
    Der Button hat als Content den Namen des UC (ist im Header mit x:Name definiert).
    Als Command hat der Button das Command Property vom UcTestViewModel und führt dort die private Methode ButtonClick aus.

    Die Methode zählt einfach die Klicks hoch und zeigt sie nebst Text im Textblock an.

    Die WpfBase ist nur da um 2 Klassen zur Verfügung zu stellen (RelayCommand und ViewModelBase)
    ViewModelBase um INotifyPropertyChanged zur Verfügung zu stellen.
    RelayCommand um Commands zu implementieren.

    Grüße

    Edit: wenn Du natürlich deine Commands als eigene Klassen definierts, dann hast im UcTestViewModel halt ein Property deines CommandKlassen Typs also ca. so:

    C#-Quellcode

    1. public MyCommand ButtonCommand {get;}
    2. ButtonCommand = new MyCommand(DeineParameterfürDeinenCommand);

    Das Binding im Uc ist dabei das gleiche

    XML-Quellcode

    1. <Button Command="{Binding ButtonCommand}"/>


    Beiträge zusammengefügt. ~Thunderbolt
    "Hier könnte Ihre Werbung stehen..."

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    Jetzt bin ich auch mal wieder dazu gekommen, das umzusetzen, zumindest den letzten Punkt. Verschiebung der Commans in den ViewModel-Namespace, Anlage der Commands als VM-Property und siehe da: alle Binding-Probleme weg. Vielen Dank.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.