SORU
5 Aralık 2008, Cuma


Denetler wpf binding

Bir Belgenin Veri bağlama yapmakWPF Denetler, Denetler türetme ve bir DependencyProperty, ve bir çözüm de ekleyin, 2 Çözümleri şimdiye kadar gördüğüm,"". proxy Ne ilk veya ikinci tatminkar. Birisi başka bir çözüm, ya da bunun yerine, biliyorum, ticari bir RTF yeteneğine sahip kontrol ediyorVeri bağlama? Normal Metin metin biçimlendirme ihtiyacı olduğundan alternatif ist.

Herhangi bir fikir?

CEVAP
14 NİSAN 2010, ÇARŞAMBA


Çok daha kolay bir yolu var!

Kolayca Denetler belge bağlamak için izin verir DocumentXaml (DocumentRTF) bağlı bir özelliği oluşturabilirsiniz. Otobiyografi veri modeli dize bir özelliği olduğu gibi kullanılır:

<TextBox Text="{Binding FirstName}" />
<TextBox Text="{Binding LastName}" />
<RichTextBox local:RichTextBoxHelper.DocumentXaml="{Binding Autobiography}" />

Viola! Tam olarak Denetler veri bağlanabilir!

Oldukça basit bu özelliğin implemention: özelliği ayarlandığında, yeni bir FlowDocument içine XAML (veya RTF) yük. Bu FlowDocument değiştiğinde, proerty değerini güncelleştirin.

Bu kod işe yaramalı:

using System.IO;  
using System.Text;  
using System.Windows;  
using System.Windows.Controls;  
using System.Windows.Documents;  
public class RichTextBoxHelper : DependencyObject
{
  public static string GetDocumentXaml(DependencyObject obj) 
  {
    return (string)obj.GetValue(DocumentXamlProperty); 
  }
  public static void SetDocumentXaml(DependencyObject obj, string value) 
  {
    obj.SetValue(DocumentXamlProperty, value); 
  }
  public static readonly DependencyProperty DocumentXamlProperty = 
    DependencyProperty.RegisterAttached(
      "DocumentXaml",
      typeof(string),
      typeof(RichTextBoxHelper),
      new FrameworkPropertyMetadata
      {
        BindsTwoWayByDefault = true,
        PropertyChangedCallback = (obj, e) =>
        {
          var richTextBox = (RichTextBox)obj;

          // Parse the XAML to a document (or use XamlReader.Parse())
          var xaml = GetDocumentXaml(richTextBox);
          var doc = new FlowDocument();
          var range = new TextRange(doc.ContentStart, doc.ContentEnd);

          range.Load(new MemoryStream(Encoding.UTF8.GetBytes(xaml)), 
            DataFormats.Xaml);

          // Set the document
          richTextBox.Document = doc;

          // When the document changes update the source
          range.Changed  = (obj2, e2) =>
          {
            if(richTextBox.Document==doc)
            {
              MemoryStream buffer = new MemoryStream();
              range.Save(buffer, DataFormats.Xaml);
              SetDocumentXaml(richTextBox, 
                Encoding.UTF8.GetString(buffer.ToArray()));
            }
          };
       }});
     }

Aynı kodu TextFormats için kullanılabilir.RTF veya TextFormats.XamlPackage. XamlPackage tipi için bayt bir özellik olurdu string []. yerine

XamlPackage biçimini düz XAML, özellikle resim gibi kaynakları içerir yeteneğine göre birçok avantajı vardır, ve daha esnek ve RTF daha çalışmak daha kolaydır.

Bu soru herkes bunu yapmak için kolay bir yolu işaret olmadan 15 ay boyunca sat inanmaktır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 30GB

    30GB

    14 AĞUSTOS 2006
  • Bryan Smith

    Bryan Smith

    12 Mart 2006
  • NewsyTech

    NewsyTech

    2 AĞUSTOS 2010