我有一个用户控件,它显示客户端声明类型的对象,并具有一些特殊的行为。我想使用泛型。但是,我不确定如何在XAML中声明这个:
<local:EditableListBox x:Name="SectionList" Margin="56,8,15,0" FontSize="64" SelectionChanged="SectionList_SelectionChanged" />
ListBox
使用object
成员,这让我觉得也许没有办法在这里设置类型安全。或者有吗?
(我正在构建一个Windows Phone 7应用程序,如果它有任何区别。)
更新:我完全没有在XAML中使用泛型,但我仍然试图弄清楚如何在代码隐藏中设置它。我参数化了所有内容,但它仍然在抱怨。
代码背后:
public partial class EditableListBox<T> : UserControl, INotifyPropertyChanged where T : IEditableListMember {
public EditableListBox()
{
// Error: The name 'InitializeComponent' does not exist in the current context
InitializeComponent();
Loaded += new RoutedEventHandler(EditableListBox_Loaded);
}
// ...
public int SelectedIndex
{
get
{
// Error: The name 'ContentListBox' does not exist in the current context
return ContentListBox.SelectedIndex;
}
set
{
// Error: The name 'ContentListBox' does not exist in the current context
ContentListBox.SelectedIndex = value;
}
}
XAML:
<Grid x:Name="LayoutRoot">
<ListBox x:Name="ContentListBox">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid ManipulationCompleted="Grid_ManipulationCompleted">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Image Source="{Binding IconSource}"
Grid.Column="0"
Width="96"
Height="96"
VerticalAlignment="Center"
Visibility="{Binding Editing, Converter={StaticResource visibilityConverter}}"
/>
<TextBlock Text="{Binding Name}"
Grid.Column="1"
Foreground="{Binding Enabled, Converter={StaticResource enabledConverter}}" />
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
它提供了两个编译器错误:ListBox
ContentListBox
和InitializeComponent()
未定义。我怀疑这个问题与如何将类拆分为两个partial
定义有关,而我的参数化是生成的,而生成的代码却没有。我怎么能绕过这个?
答案 0 :(得分:2)
不,您不能直接在Silverlight XAML中使用泛型类型。
但是你可以熟悉MVVM pattern。您的模型和视图模型可以很容易地成为通用类型,您可以在那里进行所有编码。 XAML视图很笨,没有或只有很少的代码,只能绑定到视图模型。
答案 1 :(得分:0)
您可以在代码隐藏中使用泛型。在XAML中没有那么多。抱歉。我正在考虑,您几乎必须在代码隐藏中生成XAML或创建控件(等)。
[<强>澄清强>]
我的意思是,在代码隐藏中你可以像你期望的那样使用泛型。制作List<>
T,制作Dicationary<>
等等
您可以使用XamlReader和XamlWriter动态生成XAML。
答案 2 :(得分:0)
我不确定Silverlight。但this帖子提供了另一种方法的链接。
答案 3 :(得分:0)
在XAML中无法使用泛型,但可以在Silverlight项目的C#代码中使用它们。如果您能够,您可以从指定类型的泛型类型创建派生类型,然后在XAML中创建它。