Можно ли использовать Generics с Silverlight? - PullRequest
0 голосов
/ 15 ноября 2010

У меня есть пользовательский элемент управления, который отображает объекты объявленного клиентом типа с некоторым специализированным поведением. Я хотел бы использовать дженерики. Однако я не уверен, как объявить это в 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 определения, а мое параметризовано, а сгенерированный код - нет. Как я могу обойти это?

Ответы [ 4 ]

2 голосов
/ 15 ноября 2010

Нет, вы не можете напрямую использовать универсальные типы в Silverlight XAML.

Но вы можете ознакомиться с шаблоном MVVM .Ваши модели и модели представления могут легко быть универсальными типами, и вы можете делать все свое кодирование там.Представления XAML тупые, не имеют кода или имеют мало кода и привязываются только к моделям представлений.

0 голосов
/ 15 ноября 2010

Я не уверен насчет Silverlight. Но этот пост дает ссылку на альтернативный подход.

0 голосов
/ 15 ноября 2010

Нет никакого способа использовать дженерики в XAML, но они могут быть использованы в коде C # вашего проекта Silverlight.Если вы можете, вы можете создать производный тип из универсального типа с указанным типом, а затем создать его в XAML.

0 голосов
/ 15 ноября 2010

вы МОЖЕТЕ использовать дженерики в коде позади.не так много в XAML.извиняюсь.Я думаю, вам в значительной степени придется сгенерировать XAML или создать элементы управления (и т. Д.) В своем коде.

[ Уточнение ]Я имею в виду, что в коде вы можете использовать дженерики так, как вы ожидаете.создание List<> из T, создание Dicationary<> и т. д.

Вы можете генерировать XAML на лету, используя XamlReader и XamlWriter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...