Заменить элемент управления в пользовательском элементе управления через свойство зависимостей - PullRequest
1 голос
/ 29 июня 2011

Я сделал простой проект, чтобы проиллюстрировать мою проблему. У меня есть пользовательский элемент управления ('ButtonPod'), в котором находится кнопка и прямоугольник:

<UserControl x:Class="SilverlightDependencyProp.ButtonPod"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">

<Grid x:Name="LayoutRoot" Background="White">
    <Rectangle Fill="Blue" />
    <Button x:Name="ButtonOnPage" Margin="50" Content="Old button content" />
</Grid>

</UserControl>

Я хочу использовать этот пользовательский элемент управления в своем приложении, но мне нужно поменять кнопку посередине. Мне нужен контроль над всеми свойствами Button, поэтому я не хочу просто выставлять свойства DependencyProperties, такие как «ButtonText» или «ButtonSize» - я бы лучше определил всю кнопку «Button», когда бы я ни использовал элемент управления. Поэтому я установил свойство зависимости ('CenterButton') следующим образом:

    public Button CenterButton
    {
        get { return (Button)GetValue(CenterButtonProperty); }
        set { SetValue(CenterButtonProperty, value); }
    }

    public static readonly DependencyProperty CenterButtonProperty =
        DependencyProperty.Register("CenterButton", typeof(Button),
        typeof(ButtonPod), new PropertyMetadata(
        CenterButtonChanged));

    private static void CenterButtonChanged(DependencyObject d,
      DependencyPropertyChangedEventArgs e)
    {
        var pod = d as ButtonPod;
        pod.ButtonOnPage = e.NewValue as Button;
    }

Затем я пытаюсь определить «CenterButton» в моем MainPage.xaml, в моем пользовательском элементе управления:

<Grid x:Name="LayoutRoot" Background="White">
    <local:ButtonPod Width="200" Height="200">
        <local:ButtonPod.CenterButton>
            <Button Content="New button content" />   
        </local:ButtonPod.CenterButton>
    </local:ButtonPod>
</Grid>

Но когда я загружаю приложение, все, что я вижу, это кнопка с надписью «Содержимое старой кнопки» - почему моя кнопка не заменяется? Проходя, я вижу, что DependencyProperty получает удар и свойство ButtonOnPage устанавливается, но визуальное дерево не обновляется. Есть идеи?

1 Ответ

1 голос
/ 29 июня 2011

Установка именованного элемента не заменяет его.Вы хотите назвать родителя и добавить к нему дочерний элемент (заменив существующих дочерних элементов).

...