none
OnNotifyProperty - Probleme RRS feed

  • Frage

  • Hey, 

    ich versuche den ItemSource einer ListBox dynamisch zu verändern.
    Ich habe einen Webbrowser, der eine PowerPoint abspielt, und in der Methode bekomme ich die aktuelle Foliennummer, die aktuell abgespielt wird(im String):

      private string GetNumber()
            { 
                oPPPresentation = (PPt.Presentation)browserProperty;
                oPPApplication = oPPPresentation.Application;
                oPPSlide = oPPApplication.ActivePresentation.SlideShowWindow.View.Slide; //get current slide of slideshow
                slide = oPPSlide.SlideNumber;// get current slidenumber
                string a = slide.ToString();
                return a;
            }


    Dazu habe ich noch eine ListBox, die mir anhand der Nummer der Folie bestimmte Daten anzeigt.
    Dies erfolgt jedoch nur über einen Button, der die aktuelle Foliennummer bekommt und dann guckt was er ausgeben soll.
    Nun aber, möchte ich dass sich diese LisBox automatisch updated und selbstständig nach der Foliennummer sucht und die bestimmten Daten dann anzeigen soll. Wie kann ich dies erreichen? Ich habe es schon OnPropertyChanged auf 'View' (Meine ListBox ist an View gebinded, aber ich kriege dauernd StackOverFlowExceptions...

    ICollectionView (ListBox hat Binding auf View):

    private CollectionViewSource cvsArtikel = new CollectionViewSource();
    
            public ICollectionView View
            {
                get
                {
                        cvsArtikel.Source = from a in Daten where a.ID == GetNumber() select a;
                        return cvsArtikel.View;
              
                }
            }

    Wichtig ist noch: Man kann ja die Folien auch in dem WebBrowserControl wechseln, sprich -> kein Button oder sonstiges wird gedrückt, daher fällt es mir auch so schwer INP zu implementieren

    Wie kann ich dies erreichen


    Grüße
    Adrian



    • Bearbeitet michad2151 Donnerstag, 26. April 2018 06:59
    Donnerstag, 26. April 2018 06:53

Alle Antworten

  • Hi Adrian,
    Im Ereignis des Buttons sollte NotifyPropertyChanged für die Eigenschaft "View" ausgelöst werden. Damit werden alle an View gebundenen Oberflächenelemente (z.B. Deine ListBox) aufgefordert, die Daten aus View erneut abzurufen. Beim Abruf der Daten wird dann über GetNumber der Wert für die where Anweisung geholt und damit gefiltert. Das alles kann man mit Haltepunkten prüfen. Wo hast Du da konkrete Probleme?

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Donnerstag, 26. April 2018 07:03
  • Hey,

    ja, dies ist mir bewusst, aber wenn ich im WebBrowser-Conrol z.B die aktuelle Folie wechsel, dann hat ja die Methode
     private string GetNumber()
            { 
                oPPPresentation = (PPt.Presentation)browserProperty;
                oPPApplication = oPPPresentation.Application;
                oPPSlide = oPPApplication.ActivePresentation.SlideShowWindow.View.Slide; //get current slide of slideshow
                slide = oPPSlide.SlideNumber;// get current slidenumber
                string a = slide.ToString();
                return a;
            }
    einen neuen Wert, aber die ListBox bekommt nichts davon mit (Weil es ja kein Button ist, sondern über den WebBrowser läuft). Wie kann ich, wenn sich die aktuelle Foliennummer wechselt die ListBox benachrichtigen?

    Grüße
    Adrian




    • Bearbeitet michad2151 Donnerstag, 26. April 2018 07:36
    Donnerstag, 26. April 2018 07:08
  • Hi Adrian,
    die Methode GetNumber ist nur wirksam, wenn sie Aufgerufen wird. In Deinen Codeauszügen wird sie in der Eigenschaft "View" aufgerufen. Die Eigenschaft "View" wird vom gebundenen Oberflächen-Steuerelement aufgerufen.

    Da bleibt die Frage: "Wie erzeugst Du ein Refresh der Oberfläche?". Üblicherweise wird ein partielles  oder vollständiges Refresh mit einem NotifyPropertyChanged ausgelöst (partiell nur für eine gebundene Eigenschaft bzw. vollständig mit string.Empty). Du musst also das gewünschte Ereignis fangen (z.B. Slide-Wechsel) und in der Ereignisroutine ein NotifyPropertyChanged mit nameof(View) ausführen. Wie das mit Deine browserProperty funktionieren kann, kann ich nicht wegen fehlender Information zu Deinem Projekt sagen.


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Donnerstag, 26. April 2018 07:40
  • Hey,

    okay, ich verstehe die Lösung, aber ich ich bin schon ganze Zeit am versuchen dem Slide-Wechsel zu fangen, aber ich schaff das nicht.
    Wenn ich das iwie im ViewModel schaffen würde müsste ich ja nur noch OnPropertyChanged auf View aufrufen oder?

    p.s. hier die browserProperty (hat lediglich den Sinn, das Document vom Codebehind dem ViewModel zu übertragen, damit ich im VM weiter mit dem Document arbeiten kann) :
    VM:
    private Object _browserProperty;
            public Object browserProperty
            {
                get { return _browserProperty; }
                set { _browserProperty = value; }
            }

    CodeBehind (xaml.cs):
       /// <summary>
            /// browser Document
            /// </summary>
            public static DependencyProperty DocProperty =
             DependencyProperty.RegisterAttached("Doc"
                 , typeof(Object)
                 , typeof(Page1)
                 , new FrameworkPropertyMetadata(null)
                 { BindsTwoWayByDefault = true });
            public static Object GetDoc(DependencyObject obj)
            {
                return (Object)obj.GetValue(DocProperty);
            }
            public static void SetDoc(DependencyObject obj, Object value)
            {
                obj.SetValue(DocProperty, value);
            }
    XAML:
                 views:Page1.Doc="{Binding browserProperty}"    

    Grüße
    Adrian

    • Bearbeitet michad2151 Donnerstag, 26. April 2018 07:50
    Donnerstag, 26. April 2018 07:48
  • Hi Adrian,
    versuche mal einen richtigen Programmablaufplan (PAP) zu erstellen, wie man das in den Grundlagen der Programmierung lernt. Da erkennst Du auch ganz schnell, wo und wann das gewünschte Ereignis zu binden ist. Dein bisher gezeigter Code ist eine abstrakte Implementierung eines Teiles des PAP. Und das ist auch nicht typsicher (Eigenschaft vom Typ object). Wie soll man da erkennen, was wirklich passiert?

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Donnerstag, 26. April 2018 07:55
  • Hey, 

    ja ich hab das jetzt sein lassen. Trotzdem danke dir!

    Grüße
    Adrian
    Donnerstag, 26. April 2018 10:11
  • Hi Adrian,
    ich kann nicht erkennen, was genau Du machst bzw. machen willst.

    Welches Ereignis löst einen Slide-Wechsel aus?

    Kannst Du da nicht das SlideShowNextSlide-Ereignis nutzen?


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Donnerstag, 26. April 2018 10:39
  • Hey Peter,

    ich will, dass wenn man die folie wechselt (über das Web-Browser Control), es OnPropertyChanged("View") auslösen soll.

    ja es müsste dieses sein, hab es auch schon anhand dieser Forumsfrage versucht es zu implementieren : hierAber jedoch funktioniert das ganze bei mir nicht, da ich nicht weiß wo genau ich das zu implementieren habe..


    Grüße
    Adrian
    • Bearbeitet michad2151 Donnerstag, 26. April 2018 11:25
    Donnerstag, 26. April 2018 11:07