[WPF] RichTextBox mit Collection verbinden


  • Administrator

    Hallo zusammen,

    Kann ich eine RichTextBox mit einer ObservableCollection verbinden, so dass, wenn ein neues Element dazukommt, dieses am Ende der RichTextBox mit der angegebenen Formatierung, welche das Element mitliefert, angehängt wird? Wenn dem so ist, wie? Überschreibt eine normale Bindung und ein IValueConverter nicht einfach den Inhalt der ganzen RichTextBox?
    Über C# Code wäre es kein Problem für mich, aber würde gerne mein Wissen über die Datenbindung erweitern 😉

    Grüssli



  • ich glaub nicht das das so geht - wie du es sagst muss es durch einen converter (da RichTextBox keine collectionview ist) und das muesste alles ueberschreiben

    muss es editierbar sein oder reicht ein read only?
    wenn readonly reicht kannst du eine listview (oder listbox) nehmen und die textblocks entsprechend formatieren
    wenns editierbar sein muss kann man zwar borderless textboxen nehmen, nur dann hat man probleme mit den zeilenumbruechen usw


  • Administrator

    Es muss sogar read only sein. Daher hatte ich auch schon die Idee mit der ListBox, nur gibt es da ein kleines Problem. Man soll mehrere Zeilen selektieren können für Copy&Paste, auch über mehrere Nachrichten hinweg. Sowas ist nur äusserst schwer in einer ListBox mit mehreren RichTextBox umzusetzen 😉

    Muss ich hier wohl auf C# Code zurückgreifen. Jetzt wollte ich mit neuster Technologie programmieren und nun sowas 🤡

    Grüssli



  • public class AppendableRichTextBox : ListBox
    {
    // implement copy & paste issues
    }

    waer das keine idee ?
    oder auch

    public class AppendableRichTextBox : RichTextBox
    {
    // implement CollectionView for binding
    }

    am sonsten

    c#:
    public ObservableCollection<string> Lines = new ObservableCollection<string>();

    xaml:
    <RichTextBox Text="{Binding Lines, Converter={StaticResource SchlagMich}}" />

    c#
    SchlagMichConverter
    return string.Join("\n", (source as ObservableCollection<string>).ToArray());

    dann brauchst du den string nur in die liste packen, der converter kann dann auch ruhig alles ueberschreiben, voellig wurst


  • Administrator

    Mr Evil schrieb:

    public class AppendableRichTextBox : ListBox
    {
    // implement copy & paste issues
    }

    waer das keine idee ?

    Das wird glaub ich zu komplex.

    Mr Evil schrieb:

    oder auch

    public class AppendableRichTextBox : RichTextBox
    {
    // implement CollectionView for binding
    }

    Das wäre dagegen interessant, wenn du noch erklären würdest, was du hier genau mit CollectionView meinst und vielleicht noch ein Tutorial oder Artikel dazu kennst? 😉
    *sich selber schonmal auf die Suche begibt*

    Mr Evil schrieb:

    dann brauchst du den string nur in die liste packen, der converter kann dann auch ruhig alles ueberschreiben, voellig wurst

    Zum einen habe ich, wie schon gesagt, nicht nur Strings, sondern Elemente mit Formatierungsangaben. Zum anderen frag ich mich nach der Effizienz, wenn hier immer wieder alles überschrieben wird. Das können tausende von Elementen sein mit jeweils hunderten von Zeichen. Das ganze dann mit Formatierung und co, da befürchte ich einfach ein Flackern und das wäre sehr unschön.

    Grüssli



  • das war nur aus der huefte geschossen
    man koennte versuchen ICollectionView zu implementieren - aber ne genauere idee haette ich auch nicht
    meine idee ist einfach diese das man im code dann bei "Add" oder dergleichen die entsprechende "AppendText" funktion aufruft
    das ICollectionView dient dann nur als wrapper fuers binding

    aber was auch gehen wuerde waere ein DependencyProperty auf eine interne liste, und in der classe dann wird nach jede aenderung der liste (INotifyCollectionChanged) der inhalt der box aktualisiert, zb angehangen usw

    so ala

    // nur pseudo zum verdeutlichen was ich mein
    class ListRichTextBox : RichTextBox
    {
    DepencencyProperty.Register("Content", typeof(List<object>));
    OnCollectionChanged()
    {
    this.AppendText(change);
    }
    }


  • Administrator

    Ich gebe auf. Habe in der Versuchphase bemerkt, dass ObservableCollection nur auf Vista verfügbar ist. Weiss der Geier wieso. Und dieses Ding nun auch noch selber zu implementieren habe ich keine Lust. Ich mache das auf einfache und altmodische Weise über C# Code.

    Habe sowieso schon ein entsprechendes Event dafür, muss somit nur noch auf dieses Event hören und kann dann immer den Text einfügen. Eine Methode anstatt einer ganzen Klassenbatterie, da fällt die Entscheidung leicht. Klar, es hätte gewisse Vorteile, aber die Arbeitsmenge steht langsam in keinem Verhältnis mehr zum Nutzen. Erst recht für einen Anfänger wie mich. Kann das später immer noch implementieren, wenn ich es wirklich brauche und ich dann mehr Erfahrung habe.

    @Mr Evil,
    Danke für die Hilfe.

    Grüssli



  • hae ?
    die ObservableCollection ist bestandteil des .net frameworks, muesste zusammen mit wpf mit der 3.5 geliefert werden
    das hat mit xp - vista usw ueberhaupt nichts zu tun


  • Administrator

    Dann probier die Klasse mal in Visual Studio unter XP zu verwenden. Er wird die Klasse nicht finden. Oder schau gleich hier vorbei:
    http://msdn.microsoft.com/de-de/library/ms668604.aspx

    Unter Platformen steht wunderbar nur Vista.

    Ich dachte bisher auch, dies hätte nichts direkt mit Vista oder XP zu tun, sondern nur mit der .NET Framework Version, aber anscheinend ist dem nicht so ...

    Grüssli



  • bei dem framework hat microsoft ueberall nur vista stehen - das heisst gar nix
    auf arbeit entwickel ich auch unter xp - kein thema
    evtl hast du das .net framework 3.5 mit sp1, und der ziel rechner nicht ?

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-238821-and-highlight-is-.html



  • bei dem framework hat microsoft ueberall nur vista stehen - das heisst gar nix

    Das ist so nicht richtig. Die "Plattform" Informationen sind sehr unterschiedlich und reichen von "nichts" bis hin zu einer längeren Liste.

    Plattformen

    Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98

    .NET Framework und .NET Compact Framework unterstützen nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen für .NET Framework.

    evtl hast du das .net framework 3.5 mit sp1, und der ziel rechner nicht ?

    ObservableCollection<(Of <(T>)>) (generische Klasse)
    .NET Framework
    Unterstützt in: 3.5, 3.0 SP1, 3.0

    Dann probier die Klasse mal in Visual Studio unter XP zu verwenden. Er wird die Klasse nicht finden.

    ObservableCollection<T> scheint mir auch auf XP verfügbar unabhängig von der Plattformangabe in der MSDN. (Zumindest kann ich ein einfaches Beispiel übersetzen und ausführen).

    Eventuell vergessen einen Verweis auf WindowsBase zu legen ?


  • Administrator

    Knuddlbaer schrieb:

    Eventuell vergessen einen Verweis auf WindowsBase zu legen ?

    Getroffen und versenkt. Aber wieso ist sowas nicht automatisch bei einer WPF Anwendung dabei? Kann eine WPF Anwendung überhaupt ohne sowas auskommen? 0..o
    Und wieso ist das Zeug in WindowsBase? Hatte nämlich extra geprüft, ob ich System.Collections drin habe, bzw. die anderen Klassen aus System.Collections.ObjectModel haben funktioniert.

    Werde wohl mal mein Template für die WPF Anwendungen prüfen müssen, ob da irgendwo versehentlich was verändert wurde. Aber das erst nachdem ich schlafen gegangen bin.

    Und meine Entscheidung bleibt auch fest. Ist mir einfach zu kompliziert über den anderen Weg und das ganze Data Binding immer noch ein zu grosses Rätsel. Möchte mich da lieber etwas sanfter annähern, sonst verlier ich noch vollständig die Lust daran und lern es nie 😃
    Bzw. vielleicht wäre auch ein Buch dazu mal nit schlecht, welches dies ein wenig ausführlicher behandelt.

    Grüssli und nochmals Danke 🙂



  • Dravere schrieb:

    Knuddlbaer schrieb:

    Eventuell vergessen einen Verweis auf WindowsBase zu legen ?

    Getroffen und versenkt. Aber wieso ist sowas nicht automatisch bei einer WPF Anwendung dabei?

    Ähmm... Visual C# 2008 Express, Neue WPF-Anwendung: WindowsBase vorhanden.

    Dravere schrieb:

    Bzw. vielleicht wäre auch ein Buch dazu mal nit schlecht, welches dies ein wenig ausführlicher behandelt.

    Ich finde das die meisten etwas umfangreicheren WPF-Bücher äußerst detailliert sind (Gerade in Bezug zu DataBinding, Templates und Co).

    cu André



  • Bezüglich des Buches, kann ich dir nur das hier empfehlen Dravere:
    http://www.amazon.de/Windows-Presentation-Foundation-NET-Benutzerschnittstellen/dp/3446410414/ref=sr_1_2?ie=UTF8&s=books&qid=1242195834&sr=8-2

    Hab ich mir letztens gekauft, wirklich Bombe das Teil, sehr detailliert und auch gut geschrieben.


  • Administrator

    LoL, ich glaub ich habe mich gestern so aufgeregt, dass dies nicht einfacher geht, dass ich mich wohl noch im Projekt verklickt habe. Anders kann ich es mir nicht mehr erklären, das Template ist korrekt und wenn ich heute ein WPF Projekt starte, dann ist WindowsBase vorhanden. Wobei mir nicht ganz klar ist, was ich dann angeklickt habe, da ich so ein WPF Design Fenster hatte ... *schulterzuck*

    @Firefighter,
    Danke für die Empfehlung. Es ist sogar schon auf meiner Liste 😉

    Falls noch mehr Empfehlungen getätigt werden können, nur her damit 😃

    Grüssli



  • hei - template ist n gutes stichwort
    werd doch ma schaun ob ich mir ein gutes mvvm template zurecht legen kann {=


Log in to reply