当前位置: 首页 > 编程语言 > C#

无法绑定到C#-XAML应用程序中属于WindowsFormsHost子对象的属性的解决方案?分享

时间:2023-04-10 17:34:28 C#

无法绑定到C#/XAML应用程序中属于WindowsFormsHost子对象的属性的解决方法?我有一个C#WPF4.51应用程序。据我所知,您不能绑定属于WPFWindowsFormsHost控件子对象的对象的属性。(如果我的假设有误,请告诉我如何去做):与WindowsFormsHost绑定在我的例子中,我有一个包含WindowsFormsHost控件的页面,其子对象是ScintillaNET编辑器控件:https://github.com/jacobslusser/ScintillaNET子控件工作正常。如果它是一个普通的WPF控件,我会将Scintilla编辑器控件的Text属性绑定到我的ViewModel中的某个字符串属性,这样我就可以通过更新Scintilla编辑器控件属性的内容来更新字符串。但是由于我无法绑定属于WindowsFormsHost子对象的属性,所以我正在寻找一种不完全笨拙或笨拙的策略/解决方案。有没有人以前遇到过这个并且有解决我的绑定/更新问题的合理策略?这里的一个简单方法是您可以创建一些专用类来包含映射到winforms控件中的属性的附加属性。在这种情况下,我只是选择文本作为示例。使用这种方法,您仍然可以正常设置绑定,但附加属性将在WindowsFormsHost上:,新的PropertyMetadata(propertyChanged));publicstaticstringGetText(WindowsFormsHosto){return(string)o.GetValue(TextProperty);}publicstaticvoidSetText(WindowsFormsHosto,stringvalue){o.SetValue(TextProperty,value);}staticvoidpropertyChanged(objectsender,DependencyPropertyChangedEventArgse){vart=(senderasWindowsFormsHost).ChildasScintilla;如果(t!=null)t.Text=Convert.ToString(e.NewValue);XAML中的用法:Child当然应该是Scintilla,否则需要修改WindowsFormsHostMap的代码。无论如何,这只是为了展示这个想法,您可以随时对其进行调整以使其变得更好。请注意,上面的代码仅适用于单向绑定(从视图模型到winforms控件)。如果你想要另一种方式,你需要为控件注册一些事件处理程序,并将值更新回该处理程序中的附加属性。这种方式非常复杂。您只能使用Windows窗体控件实现非常非常有限的绑定,因为绑定不会接收更新通知,并且可能需要显式轮询才能通过自定义RefreshValues()方法或通过轮询每个数据结果的内容来获取。但是,如果您只需要访问子控件,您应该在代码中进行绑定:(WFH.ChildasMyWinFormsControl).Text如果您计划进行大量绑定,创建WPF包装器对象(也许一个UserControl),它具有您需要的所有属性作为DependencyProperties和底层代码,每个属性将手动轮询WinForms控件,就好像它是该属性的支持字段一样。一开始有点复杂,但比手动轮询每个属性要容易。创建Windows窗体主机类型的依赖对象。以上就是C#学习教程:CannotbindtothepropertytobehindtheWindowsFormsHostsub-objectintheC#/XAMLapplication?的解决方法?所有分享的内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注——usingSystem.Windows.Forms.Integration;命名空间MainStartUp.DependencyObjects{publicclassFormHostDependencyObject:WindowsFormsHost{publicstaticreadonlyDependencyPropertyContentControlProperty=DependencyProperty.Register("ContentControl",typeof(System.Windows.Forms.Control),typeof(FormHostDependencyObject),newPropertyMetadata(newSystem.Windows.Forms.Control(),PropertyChaged));publicstaticvoidSetContentControl(UIElementelement,stringvalue){element.SetValue(ContentControlProperty,value);}publicstaticstringGetContentControl(UIElementelement){return(string)element.GetValue(ContentControlProperty);(FormHostDependencyObject)dependencyObject).Child=(System.Windows.Forms.Control)e.NewValue;}}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: