8

コントロールをwindowsFormsHostコントロールにバインドしたいという問題が発生しました。しかし、ご存知のとおり、ChildプロパティはDPではないため、ラッパーを作成しました。

/// <summary>
    ///     Bindable version of windows form hosts
    /// </summary>
    public class BindableWindowsFormsHost : WindowsFormsHost
    {
        /// <summary>
        /// Max value of the textbox
        /// </summary>
        public Control BindableChild
        {
            get { return (Control)GetValue(BindableChildProperty); }
            set 
            {
                SetValue(BindableChildProperty, value);
            }
        }

        // Using a DependencyProperty as the backing store for Max.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty BindableChildProperty =
            DependencyProperty.Register("BindableChild", typeof(Control), typeof(BindableWindowsFormsHost),  new FrameworkPropertyMetadata(new PropertyChangedCallback(OnBindableChildChanged)));

        /// <summary>
        /// Handles changes to the FlyoutWindowSize property.
        /// </summary>
        private static void OnBindableChildChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            ((WindowsFormsHost)d).Child = e.NewValue as Control;
        }
    }

e.NewValueは必要なコントロールを取得して適切に設定しますが、変更が反映されているのがわかりません。子は設定されていますが、新しいコントロールでwindowsFormsHostを表示できません。

誰かアイデアがありますか?

よろしく、Kev84

4

1 に答える 1

10

ラッパーを作成する代わりに、WindowsFormsHostをContentControlでラップし、バインディングを介してそのContentプロパティを設定することができます。これにより、WindowsFormsHostsの子プロパティが依存関係プロパティではないという問題を回避できます。

XAMLでのこのようなもの:

<ContentControl Content="{Binding MyWindowsFormsHost}" />

..そしてこれはあなたのコードビハインドで:

public WindowsFormsHost MyWindowsFormsHost
{   
    get { return new WindowsFormsHost(){Child=myWinformsControl}; }   
}
于 2012-07-16T19:34:59.647 に答える