Gå til innhold

C#: WPF - DataBinding som slutter å fungere


Anbefalte innlegg

Sitter og lager meg et lite program i WPF, men jeg sliter med en databinding som slutter å fungere etter å ha lastet inn data fra en fil. Jeg har en class som implementerer ISerializable, og hvis innhold jeg gjerne vil kunne lagre til og laste inn fra filer. Koden er som følger:

 

namespace dkProfiler
{
   [serializable()]
   public class Profile : INotifyPropertyChanged, ISerializable
   {
       public event PropertyChangedEventHandler PropertyChanged;

       protected void OnPropertyChanged(string propertyName)
       {
           PropertyChangedEventHandler handler = PropertyChanged;
           if (handler != null)
               handler(this, new PropertyChangedEventArgs(propertyName));
       }

       public string Name { get; set; }

       /// <summary>
       /// Regular constructor
       /// </summary>
       public Profile()
       {
           Name = "Unnamed profile";
       }

       /// <summary>
       /// Constructor for deserialization
       /// </summary>
       public Profile(SerializationInfo info, StreamingContext ctxt)
       {
           this.Name = info.GetValue("Name", typeof(string)) as string;
       }

       /// <summary>
       /// Serialization
       /// </summary>
       public void GetObjectData(SerializationInfo info, StreamingContext ctxt)
       {
           info.AddValue("Name", this.Name);
       }

       /// <summary>
       /// Load profile from a file
       /// </summary>
       public static Profile LoadFromFile(string fileName)
       {
           Profile profile;
           using (Stream stream = File.Open(fileName, FileMode.Open))
           {
               BinaryFormatter b = new BinaryFormatter();
               profile = b.Deserialize(stream) as Profile;
           }
           return profile;
       }

       /// <summary>
       /// Save profile to a file
       /// </summary>
       public static void SaveToFile(Profile profile, string fileName)
       {
           using (Stream stream = File.Open(fileName, FileMode.Create))
           {
               BinaryFormatter b = new BinaryFormatter();
               b.Serialize(stream, profile);
           }
       }
   }
}

Jeg har en instans av Profile-classen kalt ActiveProfile i programmet mitt, og i XAML'en min har jeg da en tekstboks der man skal kunne se og oppdatere Name-propertyen til denne instansen. Det blir gjort via en binding, som dette:

 

<TextBox Text="{Binding ActiveProfile.Name}" />

Når programmet først blir kjørt blir ActiveProfile initialisert enkelt og greit:

 

ActiveProfile = new Profile()

Teksten i tekstboksen oppdaterer seg korrekt til "Unnamed profile", og ActiveProfile.Name oppdaterer seg også som den skal når man forandrer det som står i tekstboksen. Alt fungerer fint, og via en lagre-knapp blir ActiveProfile da lagret til en fil. Problemet oppstår når jeg skal åpne filen igjen. Det gjør jeg på følgende måte:

 

ActiveProfile = Profile.LoadFromFile(fileName)

Det som da skjer er at den laster inn og leser det som står i filen helt fint, og ved å sjekke hva som er i ActiveProfile.Name etterpå ser jeg at det er akkurat det som ble lagret. Men nå vil ikke tekstboksen oppdatere seg til å vise den nye verdien i ActiveProfile.Name, og om jeg forandrer på det som står i tekstboksen forblir ActiveProfile.Name det samme. Det virker nesten som om bindingen bare forsvant når jeg erstattet den gamle instansen av ActiveProfile. Er det bare jeg som har tatt meg vann over hodet og ikke vet hva jeg driver med her, eller er det noe annet jeg burde vite om dette? Noen som har en idé til en løsning?

 

EDIT: Liten update på oppførselen. Etter å ha lastet inn en fil skjer det som nevnt ingenting med tekstboksen, men om jeg redigerer innholdet i tekstboksen og så trykker lagre-knappen, binder tekstboksen seg plutselig til ActiveProfile igjen og viser det som da var i ActiveProfile.Name når den ble lastet inn. Ikke godt å bli klok på dette her, *gruble gruble*

 

EDIT2: Etter mye om og men og lesing av dokumentasjon kom jeg over at jeg kunne prøve dette:

 

The PropertyChanged event can indicate all properties on the object have changed by using either null or String.Empty as the property name in the PropertyChangedEventArgs

Så klistret bare på en OnPropertyChanged(null) i commandsene for ny/last inn/lagre profil-knappene, og voila. Jaja. Har fremdeles mye å lære om WPF tydeligvis :roll:

Endret av Wedvich
Lenke til kommentar
  • 3 måneder senere...
Videoannonse
Annonse

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...