» »

[C#]Kako zaznati spremembo v objektu?

[C#]Kako zaznati spremembo v objektu?

abyssus ::

Trenutno se ubadam z navidez enostavno težavo, vendar mi je ne uspe rešit. Imam WPF projekt in izdelan en User Control. Tukaj prikazujem neke podatke (znotraj TextBox-ov). Podatke v textbox-e polnim s pomočjo "databindinga". Mode imam nastavljen na "TwoWay", tako da se vsaka sprememba pozna tudi na objektu, iz katerega prikazujem podatke. Želim doseči, da se ob spremembi znotraj enega izmed textbox-ov "enabla" en od gumbov, ki je privzeto "disejblan". Mislil sem, da je zadeva načeloma enostavna, preprosto sem naredil full property in znotraj set metode gumb preprosto "enajblal". Fora je, da se gumb "enajbla", ko se spremeni celoten objekt (kar je logično). Torej, ko iz seznama vseh izberem drugega, je gumb avtomatsko aktiven, ne zazna pa, ko recimo spremenim tekst znotraj enega textbox-a. Nato sem probal implementirat INotifyPropertyChanged interface na ta class ampak je isto. Kaj še narediti? Ne bi rad dodajal event-a na vse textbox-e, ker se zagotovo da narediti bolje. Kakšen predlog?

darkolord ::

Za enablat gumb je najbolje, da vanj postaviš DataTrigger in nastaviš Button.IsEnabled property glede na vrednost v textboxu.

Če implementiraš INotifyPropertyChanged, moraš PropertyChanged jasno klicati v setterju od vseh propertijev, za katere želiš, da se njihova sprememba nekje direkt manifestira.

abyssus ::

darkolord je izjavil:


Če implementiraš INotifyPropertyChanged, moraš PropertyChanged jasno klicati v setterju od vseh propertijev, za katere želiš, da se njihova sprememba nekje direkt manifestira.


Sem to tudi naredil ampak mi potem zazna samo spremembo celotnega objekta, torej ko nekje na seznamu izberem drug element.

darkolord ::

Pokaži binding pa tisti del tvojega classa

abyssus ::

Del XAML kode:
        <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding FirstName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
                 controls:TextboxHelper.ClearTextButton="True" />

        <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding LastName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
                 controls:TextboxHelper.ClearTextButton="True" />


V Code Behind imam pa samo full property:

private User user;
public User User 
{ 
    get { return user; }
    set 
    {
        if (value != user)
        {
            user = value;
            OnPropertyChanged();
        }
    }
}


Ta koda je znotraj UserControl-a, ki implementira INotifyPropertyChanged(). User class prav tako implementira ta interface, tam pa imam tudi vsak property naret kot full property in klican event PropertyChanged(). Znotraj eventa propertychanged() v usercontrolu sem tudi nastavil button na enabled ampak je težava v tem, da se gumb enajbla takoj, ko prikaže podatke, moral pa bi se takrat, ko sam ročno uredim neke podatke.

Zgodovina sprememb…

  • spremenilo: abyssus ()

darkolord ::

INotifyPropertyChanged moraš implementirat na User classu.

abyssus ::

Imam. Sedaj bi moral nekako nekje postavit button.IsEnabled = true; ampak ne vem, kje.

Zgodovina sprememb…

  • spremenilo: abyssus ()

mm&r ::

Looooooka ::

A hočeš povedat, da ne zazna spremembe med klikanjem/pisanjem in moraš focus dat na drug textbox?

Imam. Sedaj bi moral nekako nekje postavit button.IsEnabled = true; ampak ne vem, kje.

Ne tege delat. Iesanbled naj bo bindan na boolean property v viewmodelu al pa dodaj converter.

Zgodovina sprememb…

  • spremenilo: Looooooka ()

Looooooka ::

private User user;
public User User
{
get { return user; }
set
{
if (value != user)
{
user = value;
OnPropertyChanged();
}
}
}

Am...btw že tale implementacija zgleda mal bl "švoh".
OnPropertyChanged se ponavadi dela z imenom propertyja, ki je bil spremenjen.
A tale tvoja funkcija potem za vsak property posebej dvigne event?
Ker če ja je to:
-slaba praksa
-performanhčni samomor. Ko boš mel listo s par 100 objekti bo tvoj program pretty much neuporaben.

abyssus ::

V bistvu C# 5.0 omogoča, da ne rabiš passat več ime property (mislim, da compiler sam zazna). In ja, znotraj classa imam za vsak property raisan event (tako sem tudi do sedaj vsepovsod zasledil). Kako naj spremenim ta del?

abyssus ::

OK, sem rešil: registriral sem se na event PropertyChanged (ki je znotraj User modela) in tam enajblal gumb in to je bilo to.

Looooooka ::

abyssus je izjavil:

OK, sem rešil: registriral sem se na event PropertyChanged (ki je znotraj User modela) in tam enajblal gumb in to je bilo to.

Upam da si enejblal boolean property v viewmodelu , na katerga je bindan isenabled property na gumbu :)
Ne zato, ker bi želel bit driska ampak če se že uporablja MVVM naj se ga uporablja pravilno.

abyssus ::

V bistvu ne uporabljam MVVM-ja, sem pa ga bindal na bool property.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

UserControl v Wrappanelu WPF

Oddelek: Programiranje
51142 (964) hurlimannxt
»

[VB] datagridview

Oddelek: Programiranje
351938 (1321) korenje3
»

[c#] LinkedList branje poljubnega elementa

Oddelek: Programiranje
161546 (1455) FrEaKmAn
»

[WPF] Vrednost Textbox kot "angle" v AxisAngleRotation3D

Oddelek: Programiranje
5784 (719) saule
»

API+VB

Oddelek: Programiranje
262089 (1793) webblod

Več podobnih tem