Pohodový přivýdělek, PHP a MySQL, 350 Kč/hod. z domova. Chceš? Klikni pro více info.

Diskuze: WPF MVVM RichTextBox

C# .NET .NET (C# a Visual Basic) WPF MVVM RichTextBox American English version English version

Aktivity (3)
Avatar
Maros2470
Člen
Avatar
Maros2470:5. ledna 16:48

Zdravím.

Snažím se svázat string z databáze s RichTextBoxem.

Pro načtení textu z RichTextBox mám tento kód:

private FlowDocument _rtfDocument;
        public FlowDocument RtfDocument
        {
            get
            {
                return _rtfDocument;
            }
            set
            {
                _rtfDocument = value; NotifyPropertyChanged("Document");
            }
        }

        private string _rtfString;
        public string RtfString
        {
            get
            {
                return _rtfString;
            }
            set
            {
                _rtfString = value; NotifyPropertyChanged("RtfString");
            }
        }

        public object SelectRecipe
        {
            set
            {
                dynamic selectedValue = value;

                object val = selectedValue;
                SelectedRecipe = val as Recipe;

                if (value is Recipe)
                {
                    var a = value as Recipe;
                    SelectedRecipe.Uid = a.Uid;
                    RecipeId = a.Uid;
                    SelectedImage = Images.Where(o => o.RecipeId == RecipeId).First();

                    var doc = RtfDocument;
                    var range = new TextRange(doc.ContentStart, doc.ContentEnd);
                    var ms = new MemoryStream();
                    var sw = new StreamWriter(ms);
                    sw.Write(SelectedRecipe.RecipeText);
                    sw.Flush();
                    ms.Seek(0, SeekOrigin.Begin);
                    range.Load(ms, DataFormats.Rtf);


                }
            }
        }

Pro ukládání do databáze tento kód:

public void SaveRecipe()
        {
            if (SelectedRecipe != null)
            {
                var range = new TextRange(RtfDocument.ContentStart, RtfDocument.ContentEnd);
                var ms = new MemoryStream();
                range.Save(ms, DataFormats.Rtf);
                ms.Seek(0, SeekOrigin.Begin);
                SelectedRecipe.RecipeText = RtfString;
            }
            Save();
            RefreshRecipeForList();
        }

xaml:

<RichTextBox Grid.Row="0" Grid.RowSpan="2" ScrollViewer.VerticalScrollBarVisibility="Auto" Margin="5" MinHeight="300">
                <FlowDocument>
                    <Paragraph>
                        <Run  Text="{Binding RtfDocument}"/>
                    </Paragraph>
                </FlowDocument>
            </RichTextBox>

Bohužel, ale bez výsledku. Můžete mi někdo poradit v čem dělám chybu?

Díky za rady.

 
Odpovědět 5. ledna 16:48
Avatar
ostrozan
Redaktor
Avatar
ostrozan:5. ledna 18:32

DataContext je nastavený?
Kde přesně to zkolabuje?

 
Nahoru Odpovědět 5. ledna 18:32
Avatar
Maros2470
Člen
Avatar
Odpovídá na ostrozan
Maros2470:5. ledna 18:46

Trochu jsem to předělal a data mi to ukládá, problém je v načítání z databáze.

 
Nahoru Odpovědět 5. ledna 18:46
Avatar
Maros2470
Člen
Avatar
Odpovídá na ostrozan
Maros2470:5. ledna 19:32

Nevím jestli je to uložené správně. Výsledek v databázi vypadá takto:

{\rtf1\ansi\an­sicpg1252\uc1\h­tmautsp\deff2{\fon­ttbl{\f0\fchar­set0 Times New Roman;}{\f2\fc­harset0 Georgia;}}{\co­lortbl\red0\gre­en0\blue0;\red255\g­reen255\blue255;}\loch\­hich\dbch\par­d\plain\ltrpar\i­tap0{\lang1033\fs24\f­2\cf0 \cf0\qj{\f2 {\ltrch 123456}\li0\r­i0\sa0\sb0\fi0\qj\par}
}
}

 
Nahoru Odpovědět 5. ledna 19:32
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na Maros2470
ostrozan:5. ledna 20:08

Ano to je rtf
Když ho ale chceš zobrazit - musíš zas v něčem, co to umí - RichTextBox, FlowDocumentViewer apod
"tady ":http://www.wpf-tutorial.com/…text-editor/ je takový zajímavý příklad kde je součástí ukládání a načítání rtf souboru

 
Nahoru Odpovědět 5. ledna 20:08
Avatar
Maros2470
Člen
Avatar
Odpovídá na ostrozan
Maros2470:5. ledna 21:20

To načítání mám takto, ale nezobrazí se nic:

FlowDocument RtfDocument = new FlowDocument();
                var range = new TextRange(RtfDocument.ContentStart, RtfDocument.ContentEnd);
                var ms = new MemoryStream();
                var sw = new StreamWriter(ms);
                sw.Write(SelectedRecipe.RecipeText);
                sw.Flush();
                ms.Seek(0, SeekOrigin.Begin);
                range.Load(ms, DataFormats.Rtf);
 
Nahoru Odpovědět 5. ledna 21:20
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na Maros2470
ostrozan:5. ledna 21:29

Pokud dobře vidím, tak tam máš StreamWriter, tím se do souboru zapisuje - na čtení je StreamReader :)

 
Nahoru Odpovědět 5. ledna 21:29
Avatar
Maros2470
Člen
Avatar
Odpovídá na ostrozan
Maros2470:5. ledna 21:49

Nedaří se, asi jsem úplně blbý.

 
Nahoru Odpovědět 5. ledna 21:49
Avatar
ostrozan
Redaktor
Avatar
ostrozan:5. ledna 22:58

Tak už asi nezbyde než abys dal celý kód k nahlédnutí

 
Nahoru Odpovědět 5. ledna 22:58
Avatar
Maros2470
Člen
Avatar
Odpovídá na ostrozan
Maros2470:5. ledna 23:09

Leze na mně chřipka, tak mi to moc nemyslí. V podstatě potřebuji jen, aby se mi string SelectedRecipe­.RecipeText načetl do RichTextBoxu. V tom SelectedRecipe­.RecipeText je uložen ten Rtf string jak jsem jej posílal. Snažím se používat čisté mvvm.

 
Nahoru Odpovědět 5. ledna 23:09
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na Maros2470
ostrozan:6. ledna 12:06

Tak teď teprve jsem si všiml, že v tom XAMLu binduješ string (Run.Text) na FlowDocument - což samozřejmě nebude fungovat

 
Nahoru Odpovědět 6. ledna 12:06
Avatar
Maros2470
Člen
Avatar
Odpovídá na ostrozan
Maros2470:6. ledna 13:08

Já si myslel, že chyba bude v bindování. Jak bych to měl tedy nabindovat?

 
Nahoru Odpovědět 6. ledna 13:08
Avatar
Maros2470
Člen
Avatar
Odpovídá na ostrozan
Maros2470:6. ledna 14:08

Snažil jsem se to vygooglit, ale marně.

 
Nahoru Odpovědět 6. ledna 14:08
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na Maros2470
ostrozan:6. ledna 17:32

Hm asi to nebude nic jednoduchého - Document RichTextBoxu není DependencyProperty - jakési řešení jsem našel tady
a nebo nějak úplně jinak - já nevím, třeba v tom setteru vyvolat událost?

Editováno 6. ledna 17:34
 
Nahoru Odpovědět 6. ledna 17:32
Avatar
Maros2470
Člen
Avatar
Odpovídá na ostrozan
Maros2470:6. ledna 20:09

Tohle celkem chápu, jen nevím jak svázat v xamlu BindableRichTextBox s RichTextBox

 
Nahoru Odpovědět 6. ledna 20:09
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na Maros2470
ostrozan:6. ledna 20:50

No já jsem to pochopil tak, že máš použít ten BindableRichTextBox místo originál RichTextBoxu a i ten binding bych nastavil v kódu .cs - ne v xaXAMLu

 
Nahoru Odpovědět 6. ledna 20:50
Avatar
Maros2470
Člen
Avatar
Odpovídá na ostrozan
Maros2470:6. ledna 21:01

Už jsem se dostal dále, ale zobrazí to pouze string uložený v databázi. Rtf, nebo xaml ne. Ten převod z rtf na FlowDocument mám takto:

if (SelectedRecipe != null)
            {
                byte[] byteArray = Encoding.UTF8.GetBytes(SelectedRecipe.RecipeText);
                using (MemoryStream ms = new MemoryStream(byteArray))
                {
                    TextRange tr = new TextRange(RtfDocument.ContentStart, RtfDocument.ContentEnd);
                    tr.Load(ms, DataFormats.Rtf);
                }
            }

Binduji ten RtfDocument. SelectedRecipe­.RecipeName je rtf soubor z databáze.

xaml je takto:

<class:BindableRichTextBox Document="{Binding SelectedRecipe.RecipeText, Converter={StaticResource FlowDocumentConverter}}"  Grid.Column="0" Grid.RowSpan="2" ScrollViewer.VerticalScrollBarVisibility="Auto" Margin="5" MinHeight="300">
                <RichTextBox.Resources>
                    <Style TargetType="{x:Type Paragraph}">
                        <Setter Property="Margin" Value="0"/>
                    </Style>
                </RichTextBox.Resources>

            </class:BindableRichTextBox>
 
Nahoru Odpovědět 6. ledna 21:01
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 17 zpráv z 17.