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>
1 ответ
Одно из первых правил свойств зависимостей - никогда не включать никакую логику в get и set, кроме GetValue
а также SetValue
звонки. Это потому, что когда они используются в XAML, они фактически не проходят через методы доступа get и set. Они вписаны с GetValue
а также SetValue
звонки. Так что ни один ваш код не будет выполнен.
Надлежащий способ сделать это - настроить обратный вызов, используя PropertyMetadata
параметр в DependencyProperty.Register
метод. Затем в обратном вызове вы можете выполнить любой дополнительный код.