[英]Winforms Databinding with a custom setter
我在 Winforms 項目中使用了一些很好的舊式 DataBinding。
我有一個帶有控件的表單(對於那些想知道的人來說是一個 devExpress RichTextEdit)
我想將 RichTextEdit 控件的 HtmlText 屬性綁定到我的 ViewModel 上的一個屬性
我已經完成了綁定,這不是問題。 但是我已經意識到從richTextEdit 出來的HtmlText 是HtmlEncoded。 這意味着字符被編碼到它們的 html 實體表示中。 例如<
變成<
等等
我不希望這種情況發生,因為這些標簽具有特殊的意義,我需要保留它們。
所以在我的 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.