WindowsFormsHost и DependencyProperty

У меня есть элемент управления Windows Forms, который я пытаюсь обернуть как элемент управления WPF, используя класс WindowsFormsHost; Я хотел бы привязать устаревший элемент управления к модели представления. В частности, элемент управления предоставляет свойство сетки GridVisible, к которому я хотел бы привязать модель представления. Я использую частное статическое поле поддержки и статическое свойство только для чтения для представления свойства зависимости (функционально то же, что и статическое общедоступное поле, но меньше беспорядка). Когда я пытаюсь установить свойство GridVisible элемента управления с помощью XAML, оно не обновляется. Идеи? Что я делаю неправильно?

Класс DrawingHost

/// <summary>
/// Provides encapsulation of a drawing control.
/// </summary>
public class DrawingHost : WindowsFormsHost
{
    #region Data Members

    /// <summary>
    /// Holds the disposal flag.
    /// </summary>
    private bool disposed;

    /// <summary>
    /// Holds the grid visible property.
    /// </summary>
    private static readonly DependencyProperty gridVisibleProperty =
        DependencyProperty.Register("GridVisible", typeof(bool),
        typeof(DrawingHost), new FrameworkPropertyMetadata(false,
            FrameworkPropertyMetadataOptions.AffectsRender |
            FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));

    /// <summary>
    /// Holds the pad.
    /// </summary>
    private readonly DrawingPad pad = new DrawingPad();

    #endregion

    #region Properties

    /// <summary>
    /// Get or set whether the grid is visible.
    /// </summary>
    public bool GridVisible
    {
        get { return (bool)GetValue(GridVisibleProperty); }
        set { SetValue(GridVisibleProperty, pad.GridVisible = value); }
    }

    /// <summary>
    /// Get the grid visible property.
    /// </summary>
    public static DependencyProperty GridVisibleProperty
    {
        get { return gridVisibleProperty; }
    }

    #endregion

    /// <summary>
    /// Default-construct a drawing host.
    /// </summary>
    public DrawingHost()
    {
        this.Child = this.pad;
    }

    /// <summary>
    /// Dispose of the drawing host.
    /// </summary>
    /// <param name="disposing">The disposal invocation flag.</param>
    protected override void Dispose(bool disposing)
    {
        if (disposing && !disposed)
        {
            if (pad != null)
            {
                pad.Dispose();
            }
            disposed = true;
        }
        base.Dispose(disposing);
    }
}


XAML

<UserControl x:Class="Drawing.DrawingView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
mc:Ignorable="d" 
xmlns:local="clr-namespace:Drawing">
<local:DrawingHost GridVisible="True"/></UserControl>

person Chris    schedule 22.04.2010    source источник


Ответы (1)


Одно из первых правил свойств зависимостей — никогда не включать в get и set никакой логики, кроме вызовов GetValue и SetValue. Это связано с тем, что когда они используются в XAML, они фактически не проходят через методы доступа get и set. Они встроены в вызовы GetValue и SetValue. Таким образом, ни один из ваших кодов не будет выполнен.

Подходящим способом сделать это является настройка обратного вызова с использованием параметра PropertyMetadata в методе DependencyProperty.Register. Затем в обратном вызове вы можете выполнить любой дополнительный код.

person Charlie    schedule 22.04.2010
comment
Спасибо, Чарли! Я указал обратный вызов назначения, и он работает, как ожидалось. - person Chris; 22.04.2010