繁体   English   中英

带有自定义设置器的 Winforms 数据绑定

[英]Winforms Databinding with a custom setter

我在 Winforms 项目中使用了一些很好的旧式 DataBinding。

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

我想将 RichTextEdit 控件的 HtmlText 属性绑定到我的 ViewModel 上的一个属性

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

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

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

谢谢

您可以使用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);

我设法自己发现了这一点,但是当我努力在谷歌上找到关于此的任何内容时,我想我会自己并希望能帮助未来的开发人员

绑定上有一个名为 Parse 的事件。 订阅此事件允许您在将值发送回数据源之前对其进行处理。

它的伙伴是 Format 事件,它允许您在该值显示在控件中之前对其进行处理

https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.binding.parse?view=netframework-4.8

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM