2010-06-29 3 views
2

Есть ли способ иметь список, заполненный как статическими, так и динамическими элементами?Silverlight ListBox - статические объекты, связанные с привязкой

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

Edit:

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

ответ

1

Если вы пытаетесь сделать MVVM и также являетесь двусторонним связыванием SelectedItem в ListBox, будет намного проще/чище просто привязать одну коллекцию к свойству ItemsSource.

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

+0

Я тоже думал об этом, но проблема в том, что статический элемент отличается от динамических элементов (статический элемент содержит текстовое поле, динамические элементы содержат текстовый блок). Можете ли вы создать два dataTemplates и использовать их в разных случаях в одном источнике данных? – chief7

+1

Вы пытались использовать DataTemplateSelector? Дополнительную информацию можно найти на странице http://msdn.microsoft.com/en-us/library/system.windows.controls.datatemplateselector.aspx. –

+0

Это поддерживается только в WPF. Я работаю в Silverlight для Windows Phone 7. – chief7

0

Поскольку существует два разных типа элементов, я думаю, что лучше всего создать пользовательский подкласс 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 по умолчанию в вашу тему/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. Обычный ItemPresenter с обычным ItemTemplate будет отображаться ниже статического списка в ScrollViewer.

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

<custom:MyListBox x:Name="ListBox" ItemsSource="{Binding DynamicItems}" StaticItems="{Binding StaticItems}"/> 
Смежные вопросы