【问题标题】:Winforms Databinding with a custom setter带有自定义设置器的 Winforms 数据绑定
【发布时间】:2019-05-16 11:18:37
【问题描述】:

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

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

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

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

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

所以在我的 ViewModel 中,所有的 notify 属性都发生了变化,并且基本上包装了我的域对象,我可以这样做

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);

现在这可以按预期工作,但是我不喜欢它。由于我当前使用的控件,我的视图模型正在做事。它“漏水”而且有气味。

我希望我的 View 能够处理特定于视图的问题。

我想做的是在控件 Html Text 属性和我的 View 模型 WrappedProperty 属性之间创建绑定,提供设置属性时要使用的自定义函数 从控件到视图模型。是可以实现的东西还是我缺少某种常见的解决模式?

谢谢

【问题讨论】:

    标签: c# winforms data-binding


    【解决方案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);
    

    【讨论】:

      【解决方案2】:

      我自己设法发现了这一点,但是当我在谷歌上挣扎了一段时间后,我想我自己会发现,希望能帮助未来的开发者

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-30
        • 1970-01-01
        • 2015-12-17
        相关资源
        最近更新 更多