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