【发布时间】:2010-01-14 22:49:19
【问题描述】:
我正在尝试创建一个希望能够公开多个内容属性的 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 控件的这些内容属性内的 UI 元素。例如,当我尝试访问 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();
}
}
}
我可能完全错误地实现了这一点。有谁知道我怎样才能让它正常工作?如何从父控件按名称访问这些 UI 元素?关于如何更好地做到这一点的任何建议?谢谢!
【问题讨论】:
标签: silverlight xaml user-controls