代码之家  ›  专栏  ›  技术社区  ›  Nick Heiner

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

  •  0
  • Nick Heiner  · 技术社区  · 14 年前

    我有一个用户控件,它显示具有某种特定行为的客户端声明类型的对象。我想用泛型。但是,我不确定如何在XAML中声明:

    <local:EditableListBox x:Name="SectionList" Margin="56,8,15,0" FontSize="64" SelectionChanged="SectionList_SelectionChanged" />
    

    ListBox 使用 object 成员们,这让我觉得也许这里没有类型安全。还是有?

    (如果有什么不同的话,我正在开发一个WindowsPhone7应用程序。)

    更新 :我完全可以在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>
    

    它给出了两个编译器错误: 列表框 ContentListBox InitializeComponent() 未定义。我怀疑这个问题和这个班怎么分成两部分有关 partial 定义,而我的是参数化的,而生成的代码不是。我怎么能避开这个?

    4 回复  |  直到 14 年前
        1
  •  2
  •   herzmeister    14 年前

    不,不能直接在Silverlight XAML中使用泛型类型。

    但你可以熟悉 MVVM pattern . 您的模型和视图模型可以很容易地成为泛型类型,并且您可以在那里进行所有编码。XAML视图是哑的,没有或很少有代码隐藏,并且只绑定到视图模型。

        2
  •  0
  •   Community Jaime Torres    7 年前

    我对Silverlight不太确定。但是 this post提供了另一种方法的链接。

        3
  •  0
  •   Mike Dour    14 年前

    在XAML中无法使用泛型,但是可以在Silverlight项目的C代码中使用它们。如果可以,可以从具有指定类型的泛型类型创建派生类型,然后在XAML中创建该派生类型。

        4
  •  0
  •   Muad'Dib    14 年前

    您可以在后面的代码中使用泛型。在XAML中没有那么多。对不起的。我想,您几乎必须在代码背后生成XAML或创建控件(等等)。

    [ 澄清 ]
    我的意思是,在后面的代码中,您可以像预期的那样使用泛型。做一个 List<> 对T,做一个 Dicationary<> 等等。

    您可以使用XamlReader和XamlWriter动态生成XAML。