Могу ли я добавить DependencyProperty на пользовательский элемент управления Windows? - PullRequest
1 голос
/ 22 февраля 2012

Я пытаюсь разместить объект Visio ActiveX в приложении WPF.

Для этого я создал проект управления пользователями Windows, в который добавляю объект Visio.Этот пользовательский элемент управления Windows затем размещается на пользовательском элементе управления WPF в объекте WindowsFormsHost.

<WindowsFormsHost Name="wfHost" Grid.Row="1">
    <wf:VisioUserControl FileNamePath="?"/>
</WindowsFormsHost>

Я хотел бы связать значение элемента FileNamePath со значениемэлемента TextBox , который определяет путь.

Проект следует шаблону MVVM, поэтому я не могу получить доступ к объекту VisioUserControl в моем ViewModel.

Решение, о котором я думал, это связать элемент FileNamePath со значением TextBox , которое содержит путь, но это не DependencyProperty и кажется, что я не могу определить его в коде пользовательского элемента управления Windows.

Итак, есть ли обходной путь для выполнения этой привязки?

Спасибо ввперед.

Ответы [ 3 ]

7 голосов
/ 22 февраля 2012

Вы можете решить эту проблему, создав UserControl, который обернет ваше VisioUserControl (я написал простое руководство по созданию UserControl здесь ).Затем вы можете добавить свойство FileNamePath зависимостей к вашему UserControl.В обработчике изменения свойства этого свойства зависимости установите свойство FileNamePath на VisioUserControl, который переносит этот пользовательский элемент управления.

2 голосов
/ 22 февраля 2012

Хорошо. Я создал пример пользовательского элемента управления WPF, в котором размещается элемент управления Winforms, со свойством зависимости, которое связано со свойством text элемента управления 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, который вы использовали. Затем в обратном вызове свойства измените текстовое свойство на имя файла или любое другое свойство, которое вы хотели.

Как упомянуто выше, это делается в коде, но отлично подходит для пользовательского элемента управления, он полностью отделен от того, что его использует, вам просто нужно привязать свойство filename к управление.

Вот ссылка на проект, который я создал, показывающий, как используется элемент управления. Существует текстовое поле, текст которого связан со свойством FileName, которое изменяет текст меток Winforms.

Вы можете поместить это в пользовательский контроль Winforms, если вы хотите использовать его в winforms (как вы упомянули в своем ответе на мой комментарий)

Попробуйте заменить метку для вашего элемента управления и посмотрите, работает ли она.

0 голосов
/ 22 февраля 2012

Почему бы не реализовать UserControl для переноса WindowsFormHost и пользовательского элемента управления Visio?Затем вы можете добавить свойство зависимости и внедрить в код за обработчиком для PropertyChangedCallback и соответствующим образом взаимодействовать с элементом управления WinForms

...