泛型可以与Silverlight一起使用吗?

时间:2010-11-15 14:50:10

标签: .net silverlight generics

我有一个用户控件,它显示客户端声明类型的对象,并具有一些特殊的行为。我想使用泛型。但是,我不确定如何在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 ContentListBoxInitializeComponent()未定义。我怀疑这个问题与如何将类拆分为两个partial定义有关,而我的参数化是生成的,而生成的代码却没有。我怎么能绕过这个?

4 个答案:

答案 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中创建它。