【问题标题】:Binding to a WPF hosted control's DependencyProperty in WinForms在 WinForms 中绑定到 WPF 托管控件的 DependencyProperty
【发布时间】:2011-03-03 17:34:06
【问题描述】:

我有一个 WinForms 应用程序,其中包含一些托管 WPF 用户控件(使用 ElementHost)的元素。

我希望能够将我的 WinForm 控件属性 (Button.Enabled) 绑定到托管 WPF 用户控件 (SearchResults.IsAccountSelected) 的自定义 DependencyProperty。

是否可以将 System.Windows.Forms.Binding 绑定到由 DependencyProperty 管理的属性?

另外,因为我知道 System.Windows.Forms.Binding 监视 INotifyPropertyChanged.PropertyChanged 事件 - 由 DependencyProperty 支持的属性会自动触发这些事件,还是我必须手动实现和管理 PropertyChanged 事件的发送?

【问题讨论】:

  • 似乎如果可以的话,将是一个严重的黑客攻击。可能不是最好的路线。
  • @jsmith - 使用绑定可能不是最好的方法吗?你认为还有哪些其他问题?是否需要考虑 UI 跨线程?

标签: c# wpf winforms data-binding elementhost


【解决方案1】:

DependencyObject 没有实现INotifyPropertyChanged,所以如果你走这条路,你将不得不手动实现 PropertyChanged 事件的发送。

幸运的是DependencyObject 确实有OnPropertyChanged 方法,因此在您的DependencyObject 派生类中实现INotifyPropertyChanged 很简单,例如:

public class MyClass : HeaderedContentControl, INotifyPropertyChanged
{
  protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
  {
    var handler = PropertyChanged;
    if(handler!=null) handler(this, new PropertyChangedEventArgs(e.Property.Name));
    base.OnPropertyChanged(e);
  }
  public event PropertyChangedEventHandler PropertyChanged;
}

我想回应 jsmith 的想法,即直接绑定到 UserControl 属性可能不是最佳途径。在大多数情况下,MVVM 是一种更好的方法。当然也有例外。

【讨论】:

  • 有人可以详细说明 MVVM 的建议吗?具体来说,这将如何以某种方式帮助外部(winforms)应用程序知道内部(wpf)控件中刚刚发生了一些事情。
  • 如果您有一个实现 INotifyPropertyChanged 的​​视图模型,则 WinForms 和 WPF 都可以绑定到同一个模型。因此,在上面的示例中,您会将 WinForms Button.Enabled 和 WPF SearchResults.IsAccountSelected 绑定到相同的模型属性。换句话说,不是将实际搜索结果存储在 WPF SearchResults 控件中,而是在模型或视图模型中拥有一个 SearchResults 对象,并且 WPF 控件将是 SearchResultsView 并绑定到它。
猜你喜欢
  • 2013-05-29
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
  • 2011-11-12
  • 1970-01-01
  • 2012-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多