Winforms数据绑定与自定义设置程序

时间:2019-05-16 11:18:38

标签: c# winforms data-binding

我在Winforms项目中使用了一些不错的老式Fashing DataBinding。

我的表单带有控件(对于那些想知道的人来说是devExpress RichTextEdit)

我想将richTextEdit控件的HtmlText属性绑定到ViewModel上的属性

我已经完成了绑定,这不是问题。但是我已经意识到,来自richTextEdit的HtmlText是HtmlEncoded。这意味着字符被编码到其html实体表示中。 例如<变成&lt;

我不希望发生这种情况,因为这些标签在线下具有特殊含义,我需要保留它们。

因此,在具有所有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属性之间创建一个绑定,提供设置该属性时要使用的自定义函数 从控件到视图模型。是可以实现的还是围绕我缺少的模式进行某种常见的工作?

谢谢

2 个答案:

答案 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