Monday, May 28, 2018

Binding to Run.TextProperty goes back to old value after the Text has been changed, then completely breaks

I am trying to create a RichTextBox with a Run object inside that has it's Text property bound to a string property in my custom-made object. Here's how I create the binding:

 Paragraph paragraph = new Paragraph(); Run run = new Run(); Binding bodyBinding = new Binding("Body"); PresentationTraceSources.SetTraceLevel(bodyBinding, PresentationTraceLevel.High); bodyBinding.Source = OpenedFiles[index]; bodyBinding.Mode = BindingMode.TwoWay; bodyBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; run.SetBinding(Run.TextProperty, bodyBinding); paragraph.Inlines.Add(run); FlowDocument flowDocument = new FlowDocument(paragraph); RichTextBox rtb = new RichTextBox(flowDocument); 

This is the debugging info when creating the binding:

System.Windows.Data Warning: 56 : Created BindingExpression (hash=27037160) for Binding (hash=32830290) System.Windows.Data Warning: 58 : Path: 'Body' System.Windows.Data Warning: 62 : BindingExpression (hash=27037160): Attach to System.Windows.Documents.Run.Text (hash=42007851) System.Windows.Data Warning: 67 : BindingExpression (hash=27037160): Resolving source System.Windows.Data Warning: 70 : BindingExpression (hash=27037160): Found data context element: <null> (OK) System.Windows.Data Warning: 78 : BindingExpression (hash=27037160): Activate with root item OpenedFile (hash=42526340) System.Windows.Data Warning: 108 : BindingExpression (hash=27037160): At level 0 - for OpenedFile.Body found accessor RuntimePropertyInfo(Body) System.Windows.Data Warning: 104 : BindingExpression (hash=27037160): Replace item at level 0 with OpenedFile (hash=42526340), using accessor RuntimePropertyInfo(Body) System.Windows.Data Warning: 101 : BindingExpression (hash=27037160): GetValue at level 0 from OpenedFile (hash=42526340) using RuntimePropertyInfo(Body): 'nikjodfewsanioudawnuidwanuidwniuainudwsodf' System.Windows.Data Warning: 80 : BindingExpression (hash=27037160): TransferValue - got raw value 'nikjodfewsanioudawnuidwanuidwniuainudwsodf' System.Windows.Data Warning: 89 : BindingExpression (hash=27037160): TransferValue - using final value 'nikjodfewsanioudawnuidwanuidwniuainudwsodf' 

And this is how the OpenedFile class looks like:

public class OpenedFile : INotifyPropertyChanged { //Implementation of INotifyPropertyChanged interface public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } private string _name; private string _body; private string _prevbody; private string _path; private bool _modified; public string Name { get { return _name; } set { _name = value; NotifyPropertyChanged();} } public string Body { get { return _body; } set { _body = value; NotifyPropertyChanged(); } } public string Path { get { return _path; } set { _path = value; NotifyPropertyChanged();} } public bool Modified { get { return _modified; } set { _modified = value; NotifyPropertyChanged(); } } public OpenedFile(string name, string body, string path) { Name = name; Body = body; Path = path; Modified = false; } public OpenedFile() { Name = "New File"; Body = ""; Path = ""; Modified = true; } } 

This binding works at first (the RichTextBox displays the correct file's contents when it is created), but as soon as I type something into the RichTextBox, it gives me following info (in this example, I typed 'x' at the end of the RichTextBox):

System.Windows.Data Warning: 90 : BindingExpression (hash=27037160): Update - got raw value 'nikjodfewsanioudawnuidwanuidwniuainudwsodfx' System.Windows.Data Warning: 94 : BindingExpression (hash=27037160): Update - using final value 'nikjodfewsanioudawnuidwanuidwniuainudwsodfx' System.Windows.Data Warning: 102 : BindingExpression (hash=27037160): SetValue at level 0 to OpenedFile (hash=42526340) using RuntimePropertyInfo(Body): 'nikjodfewsanioudawnuidwanuidwniuainudwsodfx' System.Windows.Data Warning: 95 : BindingExpression (hash=27037160): Got PropertyChanged event from OpenedFile (hash=42526340) System.Windows.Data Warning: 101 : BindingExpression (hash=27037160): GetValue at level 0 from OpenedFile (hash=42526340) using RuntimePropertyInfo(Body): 'nikjodfewsanioudawnuidwanuidwniuainudwsodfx' System.Windows.Data Warning: 80 : BindingExpression (hash=27037160): TransferValue - got raw value 'nikjodfewsanioudawnuidwanuidwniuainudwsodfx' System.Windows.Data Warning: 89 : BindingExpression (hash=27037160): TransferValue - using final value 'nikjodfewsanioudawnuidwanuidwniuainudwsodfx' System.Windows.Data Warning: 90 : BindingExpression (hash=27037160): Update - got raw value 'nikjodfewsanioudawnuidwanuidwniuainudwsodf' System.Windows.Data Warning: 94 : BindingExpression (hash=27037160): Update - using final value 'nikjodfewsanioudawnuidwanuidwniuainudwsodf' System.Windows.Data Warning: 102 : BindingExpression (hash=27037160): SetValue at level 0 to OpenedFile (hash=42526340) using RuntimePropertyInfo(Body): 'nikjodfewsanioudawnuidwanuidwniuainudwsodf' System.Windows.Data Warning: 95 : BindingExpression (hash=27037160): Got PropertyChanged event from OpenedFile (hash=42526340) System.Windows.Data Warning: 101 : BindingExpression (hash=27037160): GetValue at level 0 from OpenedFile (hash=42526340) using RuntimePropertyInfo(Body): 'nikjodfewsanioudawnuidwanuidwniuainudwsodf' System.Windows.Data Warning: 80 : BindingExpression (hash=27037160): TransferValue - got raw value 'nikjodfewsanioudawnuidwanuidwniuainudwsodf' System.Windows.Data Warning: 89 : BindingExpression (hash=27037160): TransferValue - using final value 'nikjodfewsanioudawnuidwanuidwniuainudwsodf' 

So, it first correctly catches the change and updates it, but then reverts it back to the old value. Moreover, after that happens, the Binding completely breaks - it doesn't update on any text input, but it also doesn't display any info in debugging.

Does anyone know how to fix it? Please, I'm desperate at this point, I've been trying to debug it for hours. I tried removing the INotifyPropertyChanged implementation from OpenedFile class and setting the binding to a different mode.

Binding to Run.TextProperty goes back to old value after the Text has been changed, then completely breaks Click here
  • Blogger Comment
  • Facebook Comment

0 comments:

Post a Comment

The webdev Team