Silverlight ListBox - статические и связанные элементы - PullRequest
2 голосов
/ 29 июня 2010

Есть ли способ заполнить список списками как статических, так и динамических элементов?

Я пишу приложение для Windows Phone 7 и хотел бы иметь один статический listboxItem вверху или внизу, а затем связать другие элементы из viewModel.Я попытался установить статический listboxItem, а затем и dataTemplate, но статический элемент заменяется динамическими элементами.

Редактировать:

Я нашел несколько сообщений, в которых показано, как создать собственный элемент управленияэто наследует от списка, который позволяет несколько шаблонов.Как создать пользовательский элемент управления, который добавляет раздел для статических элементов, которые всегда присутствуют независимо от привязки.

Ответы [ 2 ]

1 голос
/ 29 июня 2010

Если вы пытаетесь создать MVVM и также используете двустороннюю привязку SelectedItem объекта ListBox, будет гораздо проще / понятнее связать одну коллекцию со свойством ItemsSource.просто предварительно заполнить коллекцию в вашей ViewModel статическим элементом?Затем вы можете объединить ваши динамические элементы в уже существующую коллекцию, когда они будут доступны (возвращаясь из веб-службы или чего-либо еще).Похоже, что вы все равно захотите подобную логику в своей ViewModel, и просто представите один список представлению для использования с ListBox.

0 голосов
/ 02 июля 2010

Поскольку существует два различных типа элементов, я думаю, что лучше всего было бы создать собственный подкласс ListBox, который добавляет новый DependencyProperty, чтобы позволить вам связывать и отображать второй список .Для этого также потребуется новый стиль по умолчанию для отображения второго списка соответствующим образом в том же ScrollViewer, что и обычный <ItemsPresenter/>.

Вот пример моего собственного ListBox, позволяющего это:

public class MyListBox : ListBox
{
    public MyListBox()
        : base()
    {
        this.DefaultStyleKey = typeof(MyListBox);
    }

    public static readonly DependencyProperty StaticItemsProperty = DependencyProperty.Register(
        "StaticItems",
        typeof(IList),
        typeof(MyListBox),
        null);

    public IList StaticItems
    {
        get { return (IList)GetValue(StaticItemsProperty); }
        set { SetValue(StaticItemsProperty, value); }
    }
}

Затем вам придется скопировать весь стиль ListBox по умолчанию в свой словарь ресурсов themes / generic.xaml и изменить его, чтобы он стал стилем по умолчанию для элемента управления MyListBox.Единственное, что я изменил из стиля по умолчанию (кроме атрибута TargetType), это содержимое ScrollViewer, у которого был оригинальный список:

<Style TargetType="custom:MyListBox">
    <!-- all the same old XAML for the normal ListBox -->
    <ScrollViewer x:Name="ScrollViewer" Background="{TemplateBinding Background}" BorderBrush="Transparent" BorderThickness="0" Padding="{TemplateBinding Padding}" TabNavigation="{TemplateBinding TabNavigation}">
        <StackPanel Orientation="Vertical">
            <ItemsControl ItemsSource="{TemplateBinding StaticItems}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <TextBox Text="{Binding}"/>
                    </DataTemplate>
                 </ItemsControl.ItemTemplate>
            </ItemsControl>
            <ItemsPresenter/>
        </StackPanel>
    </ScrollViewer>
    <!-- rest of the same old ListBox XAML -->
</Style>

Как вы можете видеть, я модифицировал ScrollViewer, который обычно просто содержалItemsPresenter для ListBox и заменил его на StackPanel, содержащую новый ItemsControl, связанный с новым StaticItems DependencyProperty, который я добавил в MyListBox.Я изменил DataTemplate для этого ItemsControl, чтобы показать TextBox.Обычный ItemsPresenter с обычным ItemsTemplate будет отображаться под статическим списком в ScrollViewer.

Этот пользовательский ListBox можно затем использовать вместо обычного ListBox для привязки к двум различным спискам в вашей ViewModel, причемваши статические предметы и ваши динамические предметы.

<custom:MyListBox x:Name="ListBox" ItemsSource="{Binding DynamicItems}" StaticItems="{Binding StaticItems}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...