Я сделал простой проект, чтобы проиллюстрировать мою проблему. У меня есть пользовательский элемент управления ('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 устанавливается, но визуальное дерево не обновляется. Есть идеи?