Wpf 我可以在windows用户控件上添加DependencyProperty吗?

Wpf 我可以在windows用户控件上添加DependencyProperty吗?,wpf,data-binding,.net-4.0,user-controls,Wpf,Data Binding,.net 4.0,User Controls,我正在尝试在WPF应用程序中承载Visio ActiveX对象 为此,我创建了一个Windows用户控件项目,在其中添加Visio对象。然后,此windows用户控件托管在WindowsFormsHost对象中的WPF用户控件上 <WindowsFormsHost Name="wfHost" Grid.Row="1"> <wf:VisioUserControl FileNamePath="?"/> </WindowsFormsHost> 我想做的是将

我正在尝试在WPF应用程序中承载Visio ActiveX对象

为此,我创建了一个Windows用户控件项目,在其中添加Visio对象。然后,此windows用户控件托管在WindowsFormsHost对象中的WPF用户控件上

<WindowsFormsHost Name="wfHost" Grid.Row="1">
    <wf:VisioUserControl FileNamePath="?"/>
</WindowsFormsHost>
我想做的是将FileNamePath成员的值绑定到定义路径的TextBox元素的值

该项目遵循MVVM模式,因此我无法访问ViewModel中的VisioUserControl对象

我考虑的解决方案是将FileNamePath成员绑定到包含路径的文本框的值,但它不是dependencProperty,而且我似乎无法在windows用户控件的代码隐藏中定义一个

那么,是否存在执行此绑定的变通方法


提前感谢。

您可以通过创建一个用户控件来解决这个问题,该控件封装了我编写的VisioUserControl。然后可以将FileNamePath依赖项属性添加到UserControl。在该依赖项属性的属性更改处理程序中,设置该用户控件包装的VisioUserControl上的FileNamePath属性。

您可以通过创建一个包装VisioUserControl的UserControl来解决此问题。然后可以将FileNamePath依赖项属性添加到UserControl。在此依赖项属性的属性更改处理程序中,设置此用户控件包装的VisioUserControl上的FileNamePath属性。

为什么不实现UserControl包装WindowsFormHost和Visio用户控件?然后,您可以添加依赖属性,并在PropertyChangedCallback处理程序后面的代码中实现,并适当地与WinForms控件交互,为什么不实现UserControl来包装WindowsFormHost和Visio用户控件呢?然后您可以添加一个依赖属性,并在PropertyChangedCallback的处理程序后面的代码中实现,并适当地与WinForms控件交互。好的,我创建了一个承载WinForms控件的WPF usercontrol的示例,其依赖属性绑定到WinForms控件的文本属性

 public partial class ActiveXObjectHoster : UserControl
{
    private static System.Windows.Forms.Label testObject;
    public ActiveXObjectHoster()
    {
        InitializeComponent();
        testObject = new System.Windows.Forms.Label();
        windowsFormsHost1.Child = testObject;
    }

    #region Properties
    public static DependencyProperty FileNameProperty = DependencyProperty.Register("FileName", typeof(string), typeof(ActiveXObjectHoster), new UIPropertyMetadata("",new PropertyChangedCallback(OnFileNamePropertyChanged)));


    public string FileName
    {
        get { return (string)GetValue(FileNameProperty); }
        set
        {
            SetValue(FileNameProperty, value);
        }
    }


    private static void OnFileNamePropertyChanged(
DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        testObject.Text = (string)e.NewValue;
    }


    #endregion
}
下面是控件的xaml,它非常简单

<UserControl xmlns:my="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"  
         x:Class="WPFTestApp2.Controls.ActiveXObjectHoster"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         x:Name="ObjectHost"
         Height="100" Width="100">
    <Grid>
           <my:WindowsFormsHost x:Name="windowsFormsHost1" />
    </Grid>
</UserControl>
您需要做的是将测试对象从标签更改为您正在使用的任何Visio对象。然后在属性回调中将text属性更改为filename或任何您想要的属性

如上所述,这是在代码隐藏中完成的,但这对于用户控件来说很好,它与使用它的任何东西完全解耦,您只需要绑定到控件的filename属性

我创建了一个项目,显示控件的使用方式。有一个文本框,其文本绑定到FileName属性,该属性更改Winforms标签文本

如果您想在Winforms中使用它,可以将其放置在Winforms Usercontrol中,就像您在回复我的评论时提到的那样


尝试替换控件的标签,看看它是否有效。

好的,我创建了一个承载Winforms控件的WPF usercontrol示例,其中包含一个绑定到Winforms控件文本属性的依赖项属性

 public partial class ActiveXObjectHoster : UserControl
{
    private static System.Windows.Forms.Label testObject;
    public ActiveXObjectHoster()
    {
        InitializeComponent();
        testObject = new System.Windows.Forms.Label();
        windowsFormsHost1.Child = testObject;
    }

    #region Properties
    public static DependencyProperty FileNameProperty = DependencyProperty.Register("FileName", typeof(string), typeof(ActiveXObjectHoster), new UIPropertyMetadata("",new PropertyChangedCallback(OnFileNamePropertyChanged)));


    public string FileName
    {
        get { return (string)GetValue(FileNameProperty); }
        set
        {
            SetValue(FileNameProperty, value);
        }
    }


    private static void OnFileNamePropertyChanged(
DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        testObject.Text = (string)e.NewValue;
    }


    #endregion
}
下面是控件的xaml,它非常简单

<UserControl xmlns:my="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"  
         x:Class="WPFTestApp2.Controls.ActiveXObjectHoster"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         x:Name="ObjectHost"
         Height="100" Width="100">
    <Grid>
           <my:WindowsFormsHost x:Name="windowsFormsHost1" />
    </Grid>
</UserControl>
您需要做的是将测试对象从标签更改为您正在使用的任何Visio对象。然后在属性回调中将text属性更改为filename或任何您想要的属性

如上所述,这是在代码隐藏中完成的,但这对于用户控件来说很好,它与使用它的任何东西完全解耦,您只需要绑定到控件的filename属性

我创建了一个项目,显示控件的使用方式。有一个文本框,其文本绑定到FileName属性,该属性更改Winforms标签文本

如果您想在Winforms中使用它,可以将其放置在Winforms Usercontrol中,就像您在回复我的评论时提到的那样


尝试替换控件的标签,看看它是否有效。

我可以问一下windows用户控件层的用途吗?为什么不创建一个WPFUsercontrol,其中包含WindowsFormsHost,并在代码隐藏中将VisioActiveX对象附加为WindowsFormsHost的子对象?然后您可以将DependencyProperty放入WPFUserControl。由于它是一个独立的用户控件,您几乎可以不用担心地使用后面的代码。无论如何,它与Visio ActiveX对象非常耦合……我添加了windows用户控件项目以实现可重用性,尽管我在任何其他地方都不会重复使用它……你是说在其他Winforms应用程序中重复使用吗?这很好,但出于这里的目的,您似乎只需要一个WPF用户控件。我要做的是创建一个带有要绑定的附加属性的WPF应用程序,然后将其放置在ActiveX对象中,然后在需要时将该对象包装到另一个Windows用户控件中
在WinForms中使用它。我的意思是给我一个链接,在那里我可以得到这个对象,如果你愿意,我会把它放在一个用户控件中。我可以问一下windows用户控件层是用来做什么的吗?为什么不创建一个WPFUsercontrol,其中包含WindowsFormsHost,并在代码隐藏中将VisioActiveX对象附加为WindowsFormsHost的子对象?然后您可以将DependencyProperty放入WPFUserControl。由于它是一个独立的用户控件,您几乎可以不用担心地使用后面的代码。无论如何,它与Visio ActiveX对象非常耦合……我添加了windows用户控件项目以实现可重用性,尽管我在任何其他地方都不会重复使用它……你是说在其他Winforms应用程序中重复使用吗?这很好,但出于这里的目的,您似乎只需要一个WPF用户控件。我要做的是创建一个带有要绑定的附加属性的WPF应用程序,然后将其放置在ActiveX对象中,然后在需要在WinForms中使用该对象时,将其包装到另一个Windows用户控件中。我的意思是给我一个链接,在那里我可以得到这个对象,如果你喜欢链接,我会把它放在一个用户控件中。我现在正在浏览这篇文章:这里的更新链接。。。谢谢你的链接。我现在正在浏览这篇文章:这里的更新链接。。。我真的很感谢你的努力,但我只是按照ColinE的教程实现了这一点。不过,我使用此代码将变量绑定到文本框中的值,而不是使用代码隐藏处理程序,顺便说一句,在您的解决方案中,该处理程序位于错误的类文件@AdrianArsene抱歉,我对我的错误感到困惑^ ^,我假设您将该VisioControl创建为用户控件以容纳Winforms Visio ActiveX对象?如果您查看示例中使用此代码的链接,我将绑定到主窗口中的那个链接。我很想知道你的意思。@AdrianArsene隐藏的代码是在控件中完成的,将依赖属性放入实际的winforms控件中,因为我假设你不能绑定到它的properties@AdrianArsene我将查看他的链接,看看是否能找到我做错的地方:textbox_changed事件位于用户控件的类文件中,您可以在其中设置FileName属性的值,但文本框本身位于MainWindow.xamlfile中。这是个小错误,不是问题。但在我看到你的解决方案之前,我已经实施了ColinE的解决方案。。无论如何,谢谢你:我真的很感谢你的努力,但我只是按照ColinE的教程实现了这一点。不过,我使用此代码将变量绑定到文本框中的值,而不是使用代码隐藏处理程序,顺便说一句,在您的解决方案中,该处理程序位于错误的类文件@AdrianArsene抱歉,我对我的错误感到困惑^ ^,我假设您将该VisioControl创建为用户控件以容纳Winforms Visio ActiveX对象?如果您查看示例中使用此代码的链接,我将绑定到主窗口中的那个链接。我很想知道你的意思。@AdrianArsene隐藏的代码是在控件中完成的,将依赖属性放入实际的winforms控件中,因为我假设你不能绑定到它的properties@AdrianArsene我将查看他的链接,看看是否能找到我做错的地方:textbox_changed事件位于用户控件的类文件中,您可以在其中设置FileName属性的值,但文本框本身位于MainWindow.xamlfile中。这是个小错误,不是问题。但在我看到你的解决方案之前,我已经实施了ColinE的解决方案。。无论如何,谢谢你: