Я пытаюсь создать UserControl, который, мы надеемся, сможет предоставить несколько свойств контента. Однако я нахожусь в неудаче!
Идея состояла бы в том, чтобы создать этот замечательный пользовательский элемент управления (назовем его MultiContent ), который предоставляет два свойства контента, чтобы я мог сделать следующее:
<local:MultiContent>
<local:MultiContent.ListContent>
<ListBox x:Name="lstListOfStuff" Width="50" Height="50" />
</local:MultiContent.ListContent>
<local:MultiContent.ItemContent>
<TextBox x:Name="txtItemName" Width="50" />
</local:MultiContent.ItemContent>
</local:MultiContent>
Это было бы очень полезно, теперь я могу изменять ListContent и ItemContent в зависимости от ситуации, с общими функциями, встроенными в пользовательский элемент управления MultiContent.
Однако, как я сейчас это реализовал, я не могу получить доступ к элементам пользовательского интерфейса внутри этих свойств содержимого элемента управления MultiContent . Например, lstListOfStuff и txtItemName оба null , когда я пытаюсь получить к ним доступ:
public MainPage() {
InitializeComponent();
this.txtItemName.Text = "Item 1"; // <-- txtItemName is null, so this throws an exception
}
Вот как я реализовал пользовательский элемент управления MultiContent:
XAML: MultiContent.xaml
<UserControl x:Class="Example.MultiContent"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
<Grid x:Name="LayoutRoot" Background="White">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition Width="100" />
</Grid.ColumnDefinitions>
<ContentControl x:Name="pnlList" Grid.Column="0" />
<ContentControl x:Name="pnlItem" Grid.Column="1" />
</Grid>
</UserControl>
Код позади: MultiContent.xaml.cs
// Namespaces Removed
namespace Example
{
public partial class MultiContent : UserControl
{
public UIElement ListContent
{
get { return (UIElement)GetValue(ListContentProperty); }
set
{
this.pnlList.Content = value;
SetValue(ListContentProperty, value);
}
}
public static readonly DependencyProperty ListContentProperty =
DependencyProperty.Register("ListContent", typeof(UIElement), typeof(MultiContent), new PropertyMetadata(null));
public UIElement ItemContent
{
get { return (UIElement)GetValue(ItemContentProperty); }
set
{
this.pnlItem.Content = value;
SetValue(ItemContentProperty, value);
}
}
public static readonly DependencyProperty ItemContentProperty =
DependencyProperty.Register("ItemContent", typeof(UIElement), typeof(MultiContent), new PropertyMetadata(null));
public MultiContent()
{
InitializeComponent();
}
}
}
Я, вероятно, реализую это совершенно неправильно. У кого-нибудь есть идеи, как я мог заставить это работать должным образом? Как я могу получить доступ к этим элементам интерфейса по имени из родительского элемента управления? Любые предложения о том, как сделать это лучше? Спасибо!