簡體   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