AttachedProperty не распространяется на детей? - PullRequest
0 голосов
/ 16 июля 2010

Попытка создать свой собственный AttachedProperty для WPF DependencyObject не смогла фактически выполнить то, что я от него хотел, и я немного обеспокоен тем, что (опять же) не полностью понял концепцию WPF.

Я сделал очень простой тестовый класс, чтобы показать, в чем заключается моя проблема. С Документация MSDN , я скопировал

public class TestBox : TextBox
{
    public static readonly DependencyProperty IsBubbleSourceProperty = DependencyProperty.RegisterAttached(
            "IsBubbleSource",
            typeof(Boolean),
            typeof(TestBox)
            );
    public static void SetIsBubbleSource(UIElement element, Boolean value)
    {
        element.SetValue(IsBubbleSourceProperty, value);
    }
    public static Boolean GetIsBubbleSource(UIElement element)
    {
        return (Boolean)element.GetValue(IsBubbleSourceProperty);
    }
    public Boolean IsBubbleSource
    {
        get
        {
            return (Boolean)GetValue(IsBubbleSourceProperty);
        }
        set
        {
            SetValue(IsBubbleSourceProperty, value);
        }
    }
}

Теперь, поместив мой новый и забавный TextBox в Grid, вот так

<Grid vbs:TestBox.IsBubbleSource="true">
    <vbs:TestBox x:Name="Test" Text="Test" >                    
    </vbs:TestBox>
</Grid>

Я ожидал, что каждый дочерний элемент, который не устанавливает само свойство IsBubbleSource, «наследует» его от своей родительской сетки. Это не делает этого; MessageBox.Show(Test.IsBubbleSource.ToString()) показывает «ложь». Присоединенное свойство имеет значение true. Я проверил это с помощью обработчика события OnPropertyChanged. Я что-то пропустил?

Спасибо!

1 Ответ

2 голосов
/ 16 июля 2010

По умолчанию вложенные свойства не наследуются.Вы должны указать его при определении свойства:

public static readonly DependencyProperty IsBubbleSourceProperty = DependencyProperty.RegisterAttached(
    "IsBubbleSource",
    typeof(Boolean),
    typeof(TestBox),
    new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.Inherits)
    );
...