如何数据绑定到WPF控件中托管的Winform控件?

时间:2011-09-07 13:58:33

标签: wpf winforms data-binding mvvm

我只是考虑将我们的一个自定义控件转换为WPF,但它使用另一个自定义控件来编写Winforms。

因为没有MVVM使用WPF没什么意义。如何将数据绑定到WPF控件中使用的Winforms控件。

(我没有太多的WPF经验,所以我可能完全忽略了这一点)

1 个答案:

答案 0 :(得分:6)

我认为你必须将WinForms控件包装在暴露DependencyProperties或至少实现INotifyPropertyChanged的类中。

所以你有一个类,如:

public class WinFormsWrapper : WindowsFormsHost
{
   //You'll have to setup the control as needed
   private static MyWinFormsControl _control;

   public static readonly DependencyProperty IsSpinningProperty = DependencyProperty.Register("IsSpinning", typeof(bool), typeof(WinFormsWrapper), 
        new FrameworkPropertyMetadata(_control.IsSpinning, new PropertyChangedCallback(IsSpinning_Changed)));

    private static void IsSpinning_Changed(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        _control.IsSpinning = (bool)e.NewValue;
    }

    public bool IsSpinning
    {
        get { return (bool)GetValue(IsSpinningProperty); }
        set { SetValue(IsSpinningProperty, value); }
    }
}

假设您的WinForms控件上有IsSpinning属性。根据您的需要,实现INotifyPropertyChanged而不是使用DependencyProperties可能更简单。


Ian Ringrose补充道:

此示例代码显然是错误的(请参阅有关_control是静态的注释),但显示了如何解决问题。因为我目前没有使用WPF,所以我不会编辑代码,因为我无法测试我的编辑。

我将这个答案保留为已接受的答案,因为它包含解决问题所需的信息。

我已将此添加到答案中,因为评论有时会被删除,这是人们进行谷歌搜索的获取者观点。