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 Silverlight » [Gelöst] - MVVM - SelectedItem für ItemsSource setzen (Memory Problem)
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

[Gelöst] - MVVM - SelectedItem für ItemsSource setzen (Memory Problem)

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
_Cashisclay _Cashisclay ist männlich
myCSharp.de-Mitglied

Dabei seit: 29.10.2014
Beiträge: 248


_Cashisclay ist offline

[Gelöst] - MVVM - SelectedItem für ItemsSource setzen (Memory Problem)

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

Hallo zusammen,

ich hab aktuell das Problem das manche SelectedItems nicht gesetzt werden, weil anscheinend die ItemsSource zu spät geladen wird, wie kann ich denn am besten die Daten laden bevor der DataContext gesetzt wurde?

Grüße

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von _Cashisclay am 21.05.2019 14:18.

20.05.2019 09:36 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
pinki
myCSharp.de-Mitglied

avatar-4072.jpg


Dabei seit: 24.08.2008
Beiträge: 660
Herkunft: OWL


pinki ist online

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

Hallo,
da die SelectedItems aus der ItemsSource-Auflistung stammen müssen, sind dir die doch eh erst bekannt, nachdem die Objekte der ItemsSource geladen wurden.
Wie meinst du das genau?

Gruß
20.05.2019 09:44 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
_Cashisclay _Cashisclay ist männlich
myCSharp.de-Mitglied

Dabei seit: 29.10.2014
Beiträge: 248

Themenstarter Thema begonnen von _Cashisclay

_Cashisclay ist offline

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

Hallo,

C#-Code:
            public List<ClinicModel>                    ComboBoxMaterialPreparationProtocolsClinicItemsSource
            {
                get
                {
                    return _ComboBoxMaterialPreparationProtocolsClinicItemsSource;
                }
            }

            public ClinicModel                          ComboBoxMaterialPreparationProtocolsClinicSelectedItem
            {
                get { return Item.Clinic != null ? Item.Clinic : null; }
                set
                {
                    Item.Clinic = value;
                    Raise(nameof(ComboBoxMaterialPreparationProtocolsClinicSelectedItem));

                        Raise(nameof(LabelMaterialPreparationProtocolsAdditionalRequirementContent));
                }
            }

            public ICommand                             ComboBoxMaterialPreparationProtocolsClinicSelectionChangedCommand           { get; }


            public List<ClinicStaffModel>               ComboBoxMaterialPreparationProtocolsClinicStaffItemsSource
            {
                get { return _ComboBoxMaterialPreparationProtocolsClinicStaffItemsSource; }
                set
                {
                    _ComboBoxMaterialPreparationProtocolsClinicStaffItemsSource = value;
                    Raise(nameof(ComboBoxMaterialPreparationProtocolsClinicStaffItemsSource));

                        Raise(nameof(ComboBoxMaterialPreparationProtocolsClinicStaffSelectedItem));
                }
            }

            public ClinicStaffModel                     ComboBoxMaterialPreparationProtocolsClinicStaffSelectedItem
            {
                get { return Item.ClinicStaff != null ? Item.ClinicStaff : null; }
                set
                {
                    Item.ClinicStaff = value;
                    Raise(nameof(ComboBoxMaterialPreparationProtocolsClinicStaffSelectedItem));

                        Raise(nameof(TextBoxMaterialPreparationProtocolsTimeShiftText));
                }
            }

Ich hab aktuell das Problem beim Laden meiner Eigenschaften das meine ClinicStaffItemsSource befüllt wurde, aber mein SelectedItem nicht richtig ausgewählt oder angezeigt wird.
20.05.2019 09:46 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
KroaX KroaX ist männlich
myCSharp.de-Mitglied

avatar-4080.jpg


Dabei seit: 31.08.2009
Beiträge: 275
Entwicklungsumgebung: VS2012
Herkunft: Köln


KroaX ist offline

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

Zitat:
Ich hab aktuell das Problem beim Laden meiner Eigenschaften das meine ClinicStaffItemsSource befüllt wurde, aber mein SelectedItem nicht richtig ausgewählt oder angezeigt wird.

Was heißt denn "richtig" ?

Zitat:
Item.ClinicStaff = value;

Was ist diese "Item" ?

Und was hast du überhaupt bisher versucht und wobei kommst du nicht weiter?
20.05.2019 10:18 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
pinki
myCSharp.de-Mitglied

avatar-4072.jpg


Dabei seit: 24.08.2008
Beiträge: 660
Herkunft: OWL


pinki ist online

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

Ist Item.Clinic Teil von ComboBoxMaterialPreparationProtocolsClinicItemsSource?


Statt

C#-Code:
get { return Item.Clinic != null ? Item.Clinic : null; }

kannst du auch

C#-Code:
get { return Item.Clinic; }

schreiben.
20.05.2019 10:24 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
ThomasE. ThomasE. ist männlich
myCSharp.de-Mitglied

avatar-178.gif


Dabei seit: 26.11.2013
Beiträge: 437
Entwicklungsumgebung: Visual Studio 2015Pro/2017Ent


ThomasE. ist offline

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

Zitat von _Cashisclay:
C#-Code:
            public List<ClinicStaffModel> ComboBoxMaterialPreparationProtocolsClinicStaffItemsSource
            {
                get { return _ComboBoxMaterialPreparationProtocolsClinicStaffItemsSource; }
                set
                {
                    _ComboBoxMaterialPreparationProtocolsClinicStaffItemsSource = value;
                    Raise(nameof(ComboBoxMaterialPreparationProtocolsClinicStaffItemsSource));
                    Raise(nameof(ComboBoxMaterialPreparationProtocolsClinicStaffSelectedItem));
                }
            }

Liegt es vielleicht daran, daß du als ItemsSource z.Bsp. keine 'ObservableCollection' anstatt 'List' verwendest?
20.05.2019 10:43 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
_Cashisclay _Cashisclay ist männlich
myCSharp.de-Mitglied

Dabei seit: 29.10.2014
Beiträge: 248

Themenstarter Thema begonnen von _Cashisclay

_Cashisclay ist offline

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

Nicht richtig heißt das diese Property mir angezeigt wird :

XML-Code:
<TextBox    Grid.Column="1"
                                                IsReadOnly="True"
                                                    HorizontalContentAlignment="Center" VerticalContentAlignment="Center"
                                                        Opacity="0.5"
                                                            Text="{Binding MaterialPreparationOfProtocols.ComboBoxMaterialPreparationProtocolsClinicStaffSelectedItem.DateOfTraining, Mode=OneWay, StringFormat=dd.MM.yyyy, UpdateSourceTrigger=PropertyChanged}"
                                            Style="{StaticResource BaseTextBox}"
/>

Mir aber mein SelectedItem in meiner ComboBox nicht ausgewählt wird.

Das Item entspricht meinem ObjectModel

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von _Cashisclay am 20.05.2019 11:18.

20.05.2019 11:17 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
_Cashisclay _Cashisclay ist männlich
myCSharp.de-Mitglied

Dabei seit: 29.10.2014
Beiträge: 248

Themenstarter Thema begonnen von _Cashisclay

_Cashisclay ist offline

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

Ja, ist es.

@ThomasE. - Hat keinen Unterschied gemacht.

Grüße


mycsharp.de  Moderationshinweis von Abt (20.05.2019 11:21):

Keine Full Quotes
 [Hinweis] Wie poste ich richtig?

 
20.05.2019 11:20 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
_Cashisclay _Cashisclay ist männlich
myCSharp.de-Mitglied

Dabei seit: 29.10.2014
Beiträge: 248

Themenstarter Thema begonnen von _Cashisclay

_Cashisclay ist offline

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

Also ich hab das Gefühl das es irgendwie daran liegt das die ItemsSource "später" geladen wird und das trotz Raise des SelectedItems es nicht ausreicht das die UI das Item auch setzt.
20.05.2019 11:32 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
pinki
myCSharp.de-Mitglied

avatar-4072.jpg


Dabei seit: 24.08.2008
Beiträge: 660
Herkunft: OWL


pinki ist online

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

Jetzt wurde noch MaterialPreparationOfProtocols eingeführt.
Wie steckt das da überall mit drin?

Edit:
Hast du mal mit Snoop oder ähnlichem nachgesehen, ob das Binding denn auch gültig ist oder ob es da irgendwo einen Fehler gibt?

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von pinki am 20.05.2019 11:35.

20.05.2019 11:33 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
_Cashisclay _Cashisclay ist männlich
myCSharp.de-Mitglied

Dabei seit: 29.10.2014
Beiträge: 248

Themenstarter Thema begonnen von _Cashisclay

_Cashisclay ist offline

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

MaterialPreparationOfProtocols ist eigentlich nur das ViewModel nur steckt das noch in einer anderen Klasse mit drin vom Vorentwickler, hat darauf also keine Einwirkungen.

Nein, sagt mir persönlich auch nichts, also hab das noch nie versucht. Allerdings greift die TextBox ja korrekt auf den Datensatz zu. Und die ItemsSource ist auch befüllt und wird angezeigt.

Grüße
20.05.2019 11:38 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 12.904
Herkunft: Stuttgart/Stockholm


Abt ist offline

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

Wenn Du die korrekten Typen wie ObservableCollection verwendest, spielt die Ladezeit prinzipiell keine Rolle.
Es wird aktualisiert, sobald die Items in der Collection sind (bezogen auf die Binding Direction).

Was soll denn dieses Raise() sein? Ist das eine eigene Implementierung von OnPropertyChanged() ?

Sieht mir so aus, dass das Rad an der Stelle neu erfunden wird.
Evtl. hier ein Fehler, dass die UI nicht korrekt benachrichtigt wird?
20.05.2019 12:33 Beiträge des Benutzers | zu Buddylist hinzufügen
_Cashisclay _Cashisclay ist männlich
myCSharp.de-Mitglied

Dabei seit: 29.10.2014
Beiträge: 248

Themenstarter Thema begonnen von _Cashisclay

_Cashisclay ist offline

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

C#-Code:
        public virtual void Raise(string propertyName = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

            if (IsTrackingChanges) _hasChanged = true;
        }

Es klappt ja auch mit anderen ComboBoxen nur mit dieser nicht, obwohl ich nichts anders mache, nur das die Daten erst zur Laufzeit geladen werden.
20.05.2019 13:16 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
KroaX KroaX ist männlich
myCSharp.de-Mitglied

avatar-4080.jpg


Dabei seit: 31.08.2009
Beiträge: 275
Entwicklungsumgebung: VS2012
Herkunft: Köln


KroaX ist offline

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

Mir persönlich ist die ganze Geschichte etwas zu undurchsichtig beschrieben. Man sieht nicht wo / wann und wie du dein "Item" im Code setzt. Ich vermute das es damit zusammen hängt.

Dein Combobox Binding fehlt leider auch, denn wie du beschrieben hast scheint dein SelectedItem schon falsch zu sein?

Ich würde auch allgemein davon abraten im Xaml Vekettungen von Properties im Binding zu nutzen. Setz deinen Datacontext an deinem Steuerelement möglichst explizit so dass du maximal einen Punkt, besser aber gar keinen Punkt im Binding nutzen musst.
20.05.2019 13:42 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
mfe
myCSharp.de-Mitglied

Dabei seit: 15.01.2009
Beiträge: 174


mfe ist offline

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

Setze einen Haltepunkt nach dem Laden der Oberfläche und gib den DataContext vom ComboBox Control aus. Hast du im Output irgendwelche Binding Errors?

Wahrscheinlich passt ein Binding nicht.

Das könnte vlt auch helfen  https://get-the-solution.net/blog/ItemsS...hinzuf%C3%BCgen
20.05.2019 16:37 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MarsStein MarsStein ist männlich
myCSharp.de-Poweruser/ Experte

avatar-3191.gif


Dabei seit: 27.06.2006
Beiträge: 3.117
Entwicklungsumgebung: VS 2013, MonoDevelop
Herkunft: Trier -> München


MarsStein ist offline

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

Hallo,

bist Du ganz sicher, dass das SelectedItem, dass Du initial setzen willst, die selbe Instanz ist, die auch in der ItemsSource der ComboBox steckt?

Wenn Du das Item z.B. zweimal aus den selben Daten generierst, einmal für die Nutzung als SelectedItem und einmal für die Verwendung in der ItemsSource, dann hättest Du nicht die selbe Instanz und dann ergäbe sich genau Deine Fehlerbeschreibung.

Gruß, MarsStein
20.05.2019 17:04 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
ThomasE. ThomasE. ist männlich
myCSharp.de-Mitglied

avatar-178.gif


Dabei seit: 26.11.2013
Beiträge: 437
Entwicklungsumgebung: Visual Studio 2015Pro/2017Ent


ThomasE. ist offline

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

Zitat von MarsStein:
bist Du ganz sicher, dass das SelectedItem, dass Du initial setzen willst, die selbe Instanz ist, die auch in der ItemsSource der ComboBox steckt?

natürlich im Zusammenhang mit

Zitat von Abt:
Wenn Du die korrekten Typen wie ObservableCollection verwendest, spielt die Ladezeit prinzipiell keine Rolle.
Es wird aktualisiert, sobald die Items in der Collection sind (bezogen auf die Binding Direction).

zudem auch gut zu wissen wie

Zitat von KroaX:
… wo / wann und wie du dein "Item" im Code setzt. Ich vermute das es damit zusammen hängt.

um es mal zusammenzufassen. Augenzwinkern
21.05.2019 08:50 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
_Cashisclay _Cashisclay ist männlich
myCSharp.de-Mitglied

Dabei seit: 29.10.2014
Beiträge: 248

Themenstarter Thema begonnen von _Cashisclay

_Cashisclay ist offline

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

Zitat:
bist Du ganz sicher, dass das SelectedItem, dass Du initial setzen willst, die selbe Instanz ist, die auch in der ItemsSource der ComboBox steckt?

Ja, bin ich. Hab es auch gerade nochmal geprüft.

Zitat:
… wo / wann und wie du dein "Item" im Code setzt. Ich vermute das es damit zusammen hängt.

Im Konstruktor

XML-Code:
<ComboBox   Grid.Column="1"
                                            Margin="4"
                                                ItemsSource="{Binding MaterialPreparationOfProtocols.ComboBoxMaterialPreparationProtocolsClinicStaffItemsSource, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                                    DisplayMemberPath="Name"
                                                        SelectedItem="{Binding MaterialPreparationOfProtocols.ComboBoxMaterialPreparationProtocolsClinicStaffSelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
/>

_Cashisclay hat dieses Bild (verkleinerte Version) angehängt:
Unbenannt.png
Volle Bildgröße

Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von _Cashisclay am 21.05.2019 09:12.

21.05.2019 09:00 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
witte
myCSharp.de-Mitglied

Dabei seit: 03.09.2010
Beiträge: 819


witte ist offline

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

OK, dann rate ich auch einmal: wird die Collection im richtigen Thread aktualisiert? Läuft es im GUI-Context?
21.05.2019 09:26 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
pinki
myCSharp.de-Mitglied

avatar-4072.jpg


Dabei seit: 24.08.2008
Beiträge: 660
Herkunft: OWL


pinki ist online

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

Ohne im Debugger sichtbare und übereinstimmende Object-ID könnten es immer noch nur gleiche Objekte sein.
21.05.2019 09:26 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
_Cashisclay _Cashisclay ist männlich
myCSharp.de-Mitglied

Dabei seit: 29.10.2014
Beiträge: 248

Themenstarter Thema begonnen von _Cashisclay

_Cashisclay ist offline

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

Also das sind alle Daten die ich zu den Objekten im Debugger sehen kann, wenn ich noch irgendwas ergänzen kann oder noch irgendwo nachgucken kann, klär mich bitte auf.

Im Konstruktor werden die fehlenden Daten der ItemsSource geladen, das SelectedItem ist zu der Zeit schon bekannt, ich hatte ja immer gedacht daran liegt es, aber ihr meintet Ja der Eintrag wird gesetzt sobald die ItemsSource vorhanden ist.
21.05.2019 09:40 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
_Cashisclay _Cashisclay ist männlich
myCSharp.de-Mitglied

Dabei seit: 29.10.2014
Beiträge: 248

Themenstarter Thema begonnen von _Cashisclay

_Cashisclay ist offline

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

Zitat:
Ohne im Debugger sichtbare und übereinstimmende Object-ID könnten es immer noch nur gleiche Objekte sein.

Hm ...

Zitat:
bist Du ganz sicher, dass das SelectedItem, dass Du initial setzen willst, die selbe Instanz ist, die auch in der ItemsSource der ComboBox steckt?

verwundert

Ich hab gerade mal

C#-Code:
ComboBoxMaterialPreparationProtocolsClinicStaffSelectedItem = ComboBoxMaterialPreparationProtocolsClinicStaffItemsSource.Where(x => x.Id == ComboBoxMaterialPreparationProtocolsClinicStaffSelectedItem.Id).SingleOrDefault();

als Zeile ergänzt .. Und der Eintrag wird jetzt angezeigt .. Ich würde mich gern in einem Loch vergraben. Wie kann es denn sein das ich ein Item anhand der ID aus der Datenbank vom gleichen Objekttyp Lade was 100% von den Werten zur ItemsSource gehört, nicht als Member anerkannt wird?

C#-Code:
            public ClinicStaffModel                     ComboBoxMaterialPreparationProtocolsClinicStaffSelectedItem
            {
                get { return ComboBoxMaterialPreparationProtocolsClinicStaffItemsSource != null ? Item.ClinicStaff != null ? ComboBoxMaterialPreparationProtocolsClinicStaffItemsSource.Where(x => x.Id == Item.ClinicStaff.Id).SingleOrDefault() : null : null; }
                set
                {
                    Item.ClinicStaff = value;
                    Raise(nameof(ComboBoxMaterialPreparationProtocolsClinicStaffSelectedItem));

                        Raise(nameof(TextBoxMaterialPreparationProtocolsTimeShiftText));
                }
            }

Das kann ja nicht die Lösung des Problems sein ..

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von _Cashisclay am 21.05.2019 11:04.

21.05.2019 09:59 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
_Cashisclay _Cashisclay ist männlich
myCSharp.de-Mitglied

Dabei seit: 29.10.2014
Beiträge: 248

Themenstarter Thema begonnen von _Cashisclay

_Cashisclay ist offline

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

Zitat:
bist Du ganz sicher, dass das SelectedItem, dass Du initial setzen willst, die selbe Instanz ist, die auch in der ItemsSource der ComboBox steckt?

Tatsächlich lag hier der Hund begraben. Das SelectedItem war vom selben Typ wie die ItemsSource. Die Daten haben 1 & 1 übereingestimmt, trotzdem kann man ein geladenes Object aus der ItemsSource nicht damit vergleichen.

Meine Lösung sah nun so aus das ich in der Klasse von dem Typ der ItemsSource folgendes verändert habe :

C#-Code:
        public override bool Equals(object obj)
        {

            if (obj == null || !(obj is ClinicStaffModel))
                return false;

            return ((ClinicStaffModel) obj).Id == this.Id;

        }

        public override int GetHashCode()
        {

            return Id.GetHashCode();

        }
21.05.2019 14:20 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
ThomasE. ThomasE. ist männlich
myCSharp.de-Mitglied

avatar-178.gif


Dabei seit: 26.11.2013
Beiträge: 437
Entwicklungsumgebung: Visual Studio 2015Pro/2017Ent


ThomasE. ist offline

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

Zitat von _Cashisclay:
C#-Code:
        public override bool Equals(object obj)
        {
            ClinicStaffModel csm = obj as ClinicStaffModel;
            return csm != null ? csm.Id == this.Id : false;
        }

Etwas aufhübschen Augenzwinkern
21.05.2019 15:27 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 12.904
Herkunft: Stuttgart/Stockholm


Abt ist offline

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



Zitat von ThomasE.:
Etwas aufhübschen

Augenzwinkern

Extremer aufhübschen:

C#-Code:
  public override bool Equals(object obj) => obj is ClinicStaffModel csm && csm.Id == Id;

Augenzwinkern
21.05.2019 16:02 Beiträge des Benutzers | zu Buddylist hinzufügen
_Cashisclay _Cashisclay ist männlich
myCSharp.de-Mitglied

Dabei seit: 29.10.2014
Beiträge: 248

Themenstarter Thema begonnen von _Cashisclay

_Cashisclay ist offline

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

Danke fürs aufhübschen, aber kann die Lösung vielleicht noch jemand bestätigen aus eigener Erfahrung? Bitte schau in die SDK-/MSDN-Doku smile
21.05.2019 16:05 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
KroaX KroaX ist männlich
myCSharp.de-Mitglied

avatar-4080.jpg


Dabei seit: 31.08.2009
Beiträge: 275
Entwicklungsumgebung: VS2012
Herkunft: Köln


KroaX ist offline

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

Aus eigener Erfahrung kann ich sagen:

- Arbeite entweder mit denselben Objektinstanzen ( Sprich keine Notwendigkeit Equals zu überschreiben ). Dadurch hältst du dich auf jeden Fall daran deine Objektinstanzen anständig weiter zu reichen und zu verwerfen.

ODER

- Arbeite mit Objekt ID's ( Sprich DisplayMember + ValueMember ) -> ValueMember ist hier deine ID damit das Steuerelement selbst das passende Objekt aus der Itemssource holt anhand ihres values.

Einen Mix aus beidem kann ich nicht empfehlen. Die Frage die du dir auch stellen solltest. Warum hast du überhaupt 2x eine Instanz vom selben Objekt? Bzw. mit demselben Value. Und wenn ja woher kommt es. Du ignorierst dieses potentielle Problem grade.
21.05.2019 17:07 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
witte
myCSharp.de-Mitglied

Dabei seit: 03.09.2010
Beiträge: 819


witte ist offline

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

Zitat von KroaX:
Warum hast du überhaupt 2x eine Instanz vom selben Objekt? Bzw. mit demselben Value. Und wenn ja woher kommt es.

Sowas passiert beispielsweise wenn der Client sich Objekte für eine ComboBox besorgt um eine 1:n-Beziehung abzubilden und am zu bearbeitenden Modellobjekt ein bereits ein solches Objekt hängt, was die ComboBox darstellen soll.
IEquatable<TModel> bzw Equals(TModel) zu überschreiben ist gefährlich wenn das Objekt gerade angefügt wurde, gespeichert wird und die ID sich ändert. (wenn der Client z.B. nicht mit einer GUID stempelt)
22.05.2019 11:29 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 3 Monate.
Der letzte Beitrag ist älter als 2 Monate.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 21.08.2019 10:04