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

3

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

由于没有使用MVVM就使用WPF几乎没有意义。那么,我该如何对在WPF控件中使用的Winforms控件进行数据绑定呢?

(我没有太多的WPF经验,所以我可能完全没有理解重点)


你为什么不能将最内层的WinForms控件转换为WPF?如果有原因,请在你的问题中添加这些信息。谢谢。 - Jason D
@Jason,这个应用程序已经存在多年了,控件运作良好,并被许多其他UI部分使用。 - Ian Ringrose
我认为Jonathan.Peppers的答案是正确的。只需将其托管在WindowsFormsHost控件中,并附加任何依赖属性,以使UI能够与控件的功能进行交互。 - Jose
1个回答

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,因此我不会编辑代码,因为我无法测试我的编辑结果。
我将保留此答案作为已接受的答案,因为它包含解决问题所需的信息。
我已将此添加到答案中,因为评论有时会被删除,而这是从进行谷歌搜索的人那里获得观点的好方法。

2
抱歉,但是应该将_control声明为静态的吗?您能给我一个使用包装类的示例吗? - WAKU
上面的示例似乎不言自明。您可以在Xaml中使用<local:WinFormsWrapper />声明它,如果在代码中,您只需创建一个新的并将其添加为另一个控件或窗口的子级即可。我将其更改为static以使上面的示例构建,尽管在我查看此案例时可能最好是静态的。我很久以前就回答了这个问题。我现在不怎么做WPF了。 - jonathanpeppers
WAKU,你找到任何样例了吗? - RobinAtTech

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