我在Winforms项目中使用了一些不错的老式Fashing DataBinding。
我的表单带有控件(对于那些想知道的人来说是devExpress RichTextEdit)
我想将richTextEdit控件的HtmlText属性绑定到ViewModel上的属性
我已经完成了绑定,这不是问题。但是我已经意识到,来自richTextEdit的HtmlText是HtmlEncoded。这意味着字符被编码到其html实体表示中。
例如<
变成<
等
我不希望发生这种情况,因为这些标签在线下具有特殊含义,我需要保留它们。
因此,在具有所有notify属性的ViewModel中,更改了内容并实质上包裹了我的域对象
public class ViewModel: INotifyPropertyChanged
{
public string WrappedProperty
{
get => domainObject.Property;
set
{
domainObject.Property = HttpUtility.DecodeHtml(value);
//Raise Property changed event etc
}
}
}
在我的表单中,我创建一个数据绑定
Binding binding = new Binding("HtmlText", _viewModel, "WrappedProperty", true, DataSourceUpdateMode.OnPropertyChanged,null,null);
_richEditControl.DataBindings.Add(binding);
现在这可以按预期工作,但是我不喜欢它。由于当前正在使用控件,我的视图模型正在执行操作。它的“漏气”并且闻起来。
我希望我的视图能够处理特定于视图的问题。
我想做的是在控件的Html Text属性和我的View模型的WrappedProperty属性之间创建一个绑定,提供设置该属性时要使用的自定义函数 从控件到视图模型。是可以实现的还是围绕我缺少的模式进行某种常见的工作?
谢谢
答案 0 :(得分:1)
您可以使用Parse
事件在绑定中处理此问题。
Binding binding = new Binding("HtmlText", _viewModel, "WrappedProperty", true, DataSourceUpdateMode.OnPropertyChanged,null,null);
binding.Parse += (sender, e) => e.Value = HttpUtility.DecodeHtml(e.Value);
_richEditControl.DataBindings.Add(binding);
答案 1 :(得分:0)
我设法自己发现了这个问题,但是当我努力在Google上找到一件事与此有关时,我想我会自己做些事情,希望对未来的开发人员有所帮助
绑定称为解析。订阅此事件可以使您在将值发送回数据源之前对其进行处理。
它的伙伴是Format事件,它使您可以在将值显示在控件中之前对其进行处理< / p>
https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.binding.parse?view=netframework-4.8