在WinForms中绑定WPF托管控件的DependencyProperty

3
我有一个WinForms应用程序,其中包含一些使用ElementHost托管的WPF用户控件。
我希望能够将我的WinForm控件属性(Button.Enabled)绑定到托管的WPF用户控件(SearchResults.IsAccountSelected)的自定义DependencyProperty。
是否可以将System.Windows.Forms.Binding绑定到由DependencyProperty管理的属性?
此外,由于我知道System.Windows.Forms.Binding会监视INotifyPropertyChanged.PropertyChanged事件,因此由DependencyProperty支持的属性是否会自动触发这些事件,还是我必须手动实现和管理发送PropertyChanged事件?

似乎如果你这样做,会是一个严重的黑客行为。这可能不是最好的选择。 - jsmith
1
@jsmith - 使用绑定可能不是最佳选择?您认为还有哪些其他问题?UI 跨线程是否需要考虑? - Reddog
1个回答

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)控件刚刚发生了什么。 - amonroejj
如果您有一个实现了INotifyPropertyChanged的视图模型,WinForms和WPF都可以绑定到同一个模型。因此,在上面的示例中,您将绑定WinForms Button.Enabled和WPF SearchResults.IsAccountSelected到同一个模型属性。换句话说,您不会在WPF SearchResults控件中存储实际的搜索结果,而是在您的模型或视图模型中拥有一个SearchResults对象,并且WPF控件将是SearchResultsView并绑定到它。 - Ray Burns

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接