mayho33
Goto Top

C-Sharp WPF Binding TextBox.Text und Property MVVM (die 2.)

Hallo @ All

Offensichtlich habe ich MVVM noch nicht wirklich verstanden und brauche nochmal eure Hilfe dazu.

in diesem Beitrag ( C-Sharp WPF Binding TextBox.Text und Property MVVM ) wurde es mir zwar schon mal erklärt, doch kaum habe ich die Struktur etwas anders aufgebaut, wird die Textbox nicht mehr aktualisiert. Die LÖsung mit DependencyProperties gefällt mir irgendwie auch nicht so besonders (Sorry Uwe !!)

Was ich tun möchte ist eigentlich sehr einfach: Beim Klick auf den Button öffnet sich ein FolderBrowserDialog. Der gewählte Pfad soll in der Textbox angezeigt werden.

Hier der Aufbau:

XAML
<TextBox x:Name="textBox1"  
	Text="{Binding Path= SourcePath.FolderPath, Mode= TwoWay, UpdateSourceTrigger= PropertyChanged}"/>  

<Button x:Name="button1"  
	Width="32"  
	Height="23"  
	Margin="623,117,0,0"  
	HorizontalAlignment="Left"  
	VerticalAlignment="Top"  
	Click="button_PrerequisitesPath_Click"  
	Content=". . ." />  

Code Behind
NameSpace MyNameSpace
{
    public class ViewModelBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        public void NotifyPropertyChanged(string propertyName, bool force)
        {
            if (force)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            else
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public class SourcePath : ViewModelBase
    {
        private static string _FolderPath;
        public string FolderPath
        {
            get { return _FolderPath; }
            set
            {
                if (_FolderPath == value)
                    return;

                _FolderPath = value;
                NotifyPropertyChanged("Prerequisites_FolderPath", false);  
            }
        }
    }
}


public partial class MainWindow : Window
{
  private void button1_Click(object sender, RoutedEventArgs e)
  {
      BrowseFolder();
  }

  private void BrowseFolder()
  {
      string toReturn = string.Empty;
      using (System.Windows.Forms.FolderBrowserDialog dialog = new System.Windows.Forms.FolderBrowserDialog())
      {
          SourcePath prereq = new SourcePath();
          dialog.ShowNewFolderButton = false;
          if (!string.IsNullOrEmpty(prereq.FolderPath))
              dialog.SelectedPath = prereq.FolderPath;
          else
              dialog.RootFolder = Environment.SpecialFolder.MyComputer;
          try
          {
              if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
              {
                  prereq.FolderPath = dialog.SelectedPath;
              }
          }
          catch (Exception) { }
      }
  }
}

Vorher waren alle Properties in der partial Class MainWindow definiert und das hat auch gut funktioniert. Das wurde aber schnell unübersichtlich. Außerdem wollte ich die einzelnen Properties kapseln.
Ich bin mir fast sicher dass das Problem in Zeile 46 liegt (SourcePath prereq = new Sourcepath();), nur wie umgehe ich das?

Danke für die Hilfe!

ein Noob face-smile

Content-Key: 318980

Url: https://administrator.de/contentid/318980

Printed on: May 7, 2024 at 13:05 o'clock

Mitglied: 131301
Solution 131301 Oct 26, 2016 at 08:25:58 (UTC)
Goto Top
Ich bin mir fast sicher dass das Problem in Zeile 46 liegt (SourcePath prereq = new Sourcepath();), nur wie umgehe ich das?
Eigentlich logisch weil das Objekt nur während der Prozedur BrowseFolder() exisitiert und dann sofort wieder zerstört wird. Die Textbox aber an dieses Objekt gebunden ist. Also ist die Box hinterher leer weil Objekt nicht mehr existiert. Definiere sie als globale Variable im Window oder dort wo sie so lange verfügbar/erreichbar ist solange die Textbox benötigt wird.

Gruß
Member: mayho33
mayho33 Oct 26, 2016 at 09:47:01 (UTC)
Goto Top
Auch wenn ich mir den Pfad zurückgeben lasse und dann speichern will passiert nichts. Das PropertyChanged-Event ist immer Null.
Das iritierende ist, dass es funktioniert hat solange das Property FolderPath in der Partial Class MainWindow gelegen ist. Auch da existiert ein Object nur so lange bis man eine Methode verlässt. Ich habe nichts verändert außer das Property in eine andere Class zu schieben (??)
Mitglied: 131301
131301 Oct 26, 2016 updated at 09:50:59 (UTC)
Goto Top
Auch da existiert ein Object nur so lange bis man eine Methode verlässt.
Nein. Da sie global im Window definiert ist existiert das Object natürlich so lange wie das Fenster im Speicher existiert.
Member: mayho33
mayho33 Oct 26, 2016 at 17:58:37 (UTC)
Goto Top
Da muss ich dir recht geben. Dachte da das Property befüllt wird bevor die Methode BrowseFolder() beendet ist, sollte es funktionieren.
Mach das Property mal static. Danke!