myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » GUI: WPF und XAML » Wie kann ich im WPF an Properties meiner Klasse binden?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Wie kann ich im WPF an Properties meiner Klasse binden?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Mattes80
myCSharp.de-Mitglied

Dabei seit: 30.10.2020
Beiträge: 12


Mattes80 ist offline

Wie kann ich im WPF an Properties meiner Klasse binden?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo

Ich bin Anfänger und beschäftige mich gerade mit Binding bei WPF

Ich habe mir eine Klasse erstelle wo die Variablen drin sind.

Meine Klasse

C#-Code:
namespace WPF_C_DB_Lernen
{
    class Binding_Klasse
    {

        public string ButtonName { get; set; }

        public void ButtonNameTest()
        {


            ButtonName = "Hallo";


        }
    }
}

mein MainWindow

C#-Code:
namespace WPF_C_DB_Lernen
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            Binding_Klasse BindingKlasse = new Binding_Klasse();
            BindingKlasse.ButtonNameTest();

          //  Button1.Content = BindingKlasse.ButtonName;


        }
    }
}

Mein WPF

XML-Code:
<Window x:Class="WPF_C_DB_Lernen.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WPF_C_DB_Lernen"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800"
>
    <Grid>
        <Button x:Name="Button1" Content="{Binding Path=ButtonName}" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="121" Height="67"/>

    </Grid>
</Window>

Wenn ich mein Button ein x:Name gebe und per Code mit .Content = BindingKlasse.ButtonName reinschreibe dann funktioniert das. aber es sollte ja auch ohne gehen.

Was habe ich da falsch gemacht?

Gruß

Mattes
Neuer Beitrag 25.11.2020 12:54 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MrSparkle MrSparkle ist männlich
myCSharp.de-Team

avatar-2159.gif


Dabei seit: 16.05.2006
Beiträge: 5.571
Herkunft: Leipzig


MrSparkle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Dein ViewModel muß das INotifyPropertyChanged-Interface implementieren. Hier gibt es eine ausführlichere Erklärung dazu:  [Artikel] MVVM und DataBinding
Neuer Beitrag 25.11.2020 13:12 Beiträge des Benutzers | zu Buddylist hinzufügen
Mattes80
myCSharp.de-Mitglied

Dabei seit: 30.10.2020
Beiträge: 12

Themenstarter Thema begonnen von Mattes80

Mattes80 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Danke für deine Antwort.

Mein Code sieht nun so aus.

Meine Klasse:

C#-Code:
namespace WPF_C_DB_Lernen
{
    class Binding_Klasse : INotifyPropertyChanged
    {

        public event PropertyChangedEventHandler PropertyChanged;

        public virtual void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        public string _ButtonName;

        public string ButtonName
        {
            get { return _ButtonName; }
            set
            {
                if (value != _ButtonName)
                {
                    _ButtonName = value;
                    OnPropertyChanged("ButtonName");
                }
            }
        }
        public void ButtonNameTest()
        {


            ButtonName = "Hallo";


        }
    }
}

mein MainWindow:

C#-Code:
namespace WPF_C_DB_Lernen
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            Binding_Klasse BindingKlasse = new Binding_Klasse();

            this.DataContext = BindingKlasse;

            BindingKlasse.ButtonNameTest();

        }
    }
}

Mein WPF:

C#-Code:
<Window x:Class="WPF_C_DB_Lernen.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WPF_C_DB_Lernen"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">

    <Window.DataContext>
        <local:Binding_Klasse />
    </Window.DataContext>

    <Grid>
        <Button x:Name="Button1" Content="{Binding ButtonName}" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="121" Height="67"/>

    </Grid>
</Window>

Nun noch eine Frage, kann man auch mehrere Klassen mit DataContext machen oder nur mit 1er Klasse?

Wenn es mit mehrere geht, wie funktioniert das dann?

Gruß
Mattes

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Mattes80 am 25.11.2020 17:20.

Neuer Beitrag 25.11.2020 17:19 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Caveman Caveman ist männlich
myCSharp.de-Mitglied

avatar-3854.jpg


Dabei seit: 18.10.2009
Beiträge: 137
Entwicklungsumgebung: VS2017P; VS2019P


Caveman ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Servus,

warum definierst Du den DataContext im XAML und im Code behind?
Neuer Beitrag 25.11.2020 18:37 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Mattes80
myCSharp.de-Mitglied

Dabei seit: 30.10.2020
Beiträge: 12

Themenstarter Thema begonnen von Mattes80

Mattes80 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo

So habe ich es in dem Tutorial rausgelesen.

 MVVM und DataBinding

Ich bin für jede Verbesserung dankbar will es ja auch richtig Lernen

Gruß

Mattes
Neuer Beitrag 25.11.2020 18:52 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MrSparkle MrSparkle ist männlich
myCSharp.de-Team

avatar-2159.gif


Dabei seit: 16.05.2006
Beiträge: 5.571
Herkunft: Leipzig


MrSparkle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Da steht aber: "Oder alternativ mit Hilfe von XAML".
Alternativ :)

Zitat:
kann man auch mehrere Klassen mit DataContext machen oder nur mit 1er Klasse?

DataContext kann nur ein Objekt zugewiesen werden. Normalerweise hat das Fenster ein MainViewModel, und die einzelnen Unterbereiche im Fenster dann spezielle Unter-ViewModels, welche als Eigenschaften im MainViewModel liegen. Das kann beliebig verschachtelt werden.

Ansonsten würde ich empfehlen, statt OnPropertyChanged("ButtonName") besser OnPropertyChanged(nameOf(ButtonName)) zu schreiben, weil dann die Bindung nicht verloren geht, wenn du die Eigenschaft mal umbenennst.

Und deine Binding_Klasse würde ich lieber MainViewModel oder ButtonViewModel nennen, dann ist klar, welche Aufgabe die Klasse hat.
Neuer Beitrag 25.11.2020 19:14 Beiträge des Benutzers | zu Buddylist hinzufügen
Mattes80
myCSharp.de-Mitglied

Dabei seit: 30.10.2020
Beiträge: 12

Themenstarter Thema begonnen von Mattes80

Mattes80 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Danke für deine Antwort

Was wäre besser in XAML oder in Code Behind?

Also ist nur 1 ViewModel möglich wenn ich es Richtig verstanden habe.

Ich hätte gerne verschiedene für

ButtonViewModel
LabelViewModel
TextboxViewModel

Dazu würde noch eine Extra Klasse kommen für SQLite Abfragen.
Neuer Beitrag 25.11.2020 20:20 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Caveman Caveman ist männlich
myCSharp.de-Mitglied

avatar-3854.jpg


Dabei seit: 18.10.2009
Beiträge: 137
Entwicklungsumgebung: VS2017P; VS2019P


Caveman ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

In der Regel wird alles im XAML definiert. Im MVVM Pattern wird normalerweise nichts, aber auch gar nichts im Code behind programmiert.
Und ich fürchte, du hast ein Verständnisproblem mit den View Models. Willst Du für jedes Steuerelement ein eigenes ViewModel machen? Also auch ein CheckBoxViewModel, RadioButtonViewModel, TextBlockViewModel, DataGridViewModel, ...?
Was müssen Deine ViewModels außergewöhnliches können - außer Text anzeigen - dass man dies so wie von Dir gewünscht, definieren müßte?
Ändert sich die Ansicht?
Neuer Beitrag 26.11.2020 09:55 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Mattes80
myCSharp.de-Mitglied

Dabei seit: 30.10.2020
Beiträge: 12

Themenstarter Thema begonnen von Mattes80

Mattes80 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo

mein Beispiel war ein schlechtes Beispiel. Es geht nicht um die einzelne Steuerelemente.

Ich möchte eine Trennung Zwischen Sprachanzeigen, Datenbankanzeigen und Funktionsanzeigen.

z.b.

Die ein WPF-Fenster würde ich gern ein SprachViewModel, DatenbankViewModel, und ein FunktionViewModen und sogar ein FunktionKlasse.

Damit will ich mit selber einen Besseren Überlick beschaffen und nicht alles in einer ViewModel reinpacken.

Vielleicht denke ich ein bissen zu Kompliziert.

Ich sag ja immer warum einfach wenn es ja auch Kompliziert geht :-)

Gruß

Mattes
Neuer Beitrag 27.11.2020 11:53 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
xxxprod xxxprod ist männlich
myCSharp.de-Poweruser/ Experte

avatar-2329.gif


Dabei seit: 13.04.2006
Beiträge: 1.378
Herkunft: Österreich\Wien


xxxprod ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Mattes80,

Zitat von MrSparkle:
DataContext kann nur ein Objekt zugewiesen werden. Normalerweise hat das Fenster ein MainViewModel, und die einzelnen Unterbereiche im Fenster dann spezielle Unter-ViewModels, welche als Eigenschaften im MainViewModel liegen. Das kann beliebig verschachtelt werden.

Nach dem Schema würde ich auch vorgehen und du könntest es dann zB so schachteln:

MainViewModel
-> SprachViewModel
-> DatenbankViewModel
-> FunktionsViewModel

Die Struktur kannst du auch in Form von verschachtelten Views wiederspiegeln und zB eine ähnliche Struktur in den Views anlegen:

MainView
-> SprachView
-> DatenbankView
-> FunktionsView


Das Hauptfenster bekommt als DataContext dann das MainViewModel und alles weitere ergibt sich rein aus den Bindings:

XML-Code:
<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800"
>

    <Window.DataContext>
        <local:MainViewModel></local:MainViewModel>
    </Window.DataContext>

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>

        <local:SprachView Grid.Column="0" DataContext="{Binding Path=SprachViewModel}"></local:SprachView>
        <local:DatenbankView Grid.Column="1" DataContext="{Binding Path=DatenbankViewModel}"></local:DatenbankView>
        <local:FunktionsView Grid.Column="2" DataContext="{Binding Path=FunktionsViewModel}"></local:FunktionsView>

    </Grid>
</Window>

<UserControl x:Class="WpfApp1.SprachView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:wpfApp1="clr-namespace:WpfApp1"
             mc:Ignorable="d"
             d:DesignHeight="450" d:DesignWidth="800"
             d:DataContext="{d:DesignInstance wpfApp1:SprachViewModel}"
>
    <Grid>
        <ListView ItemsSource="{Binding Sprachen}" />
    </Grid>
</UserControl>

und die entsprechenden ViewModels stark vereinfacht:

C#-Code:
    public class MainViewModel
    {
        public SprachViewModel SprachViewModel { get; set; } = new SprachViewModel();
        public DatenbankViewModel DatenbankViewModel { get; set; } = new DatenbankViewModel();
        public FunktionsViewModel FunktionsViewModel { get; set; } = new FunktionsViewModel();
    }

    public class SprachViewModel
    {
        public List<string> Sprachen { get; set; } = new List<string> {"Deutsch", "Englisch"};
    }

    public class DatenbankViewModel
    {
        public List<string> Datenbanken { get; set; } = new List<string> {"DbA", "DbB"};
    }

    public class FunktionsViewModel
    {
        public List<string> Funktionen { get; set; } = new List<string> {"DoSomething", "DoSomethingElse"};
    }

Lg, XXX
Neuer Beitrag 27.11.2020 12:39 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Mattes80
myCSharp.de-Mitglied

Dabei seit: 30.10.2020
Beiträge: 12

Themenstarter Thema begonnen von Mattes80

Mattes80 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo danke für deine Antwort

Das sieht ja schon mal sehr interessant aus. Das werde ich gleich mal heute Abend Testen.

Gruß

Mattes
Neuer Beitrag 27.11.2020 13:11 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 05.12.2020 06:47