2010-06-29 9 views
2

정적 항목과 동적 항목 모두로 채워지는 목록 상자가있는 방법이 있습니까?Silverlight ListBox - 정적 및 바운드 항목

저는 윈도우 폰 7 앱을 작성 중이며, 하나의 정적 listboxItem을 상단 또는 하단에 놓은 다음 viewModel에서 다른 항목을 바인드하고자합니다. 정적 listboxItem과 dataTemplate을 모두 설정해 보았지만 정적 항목은 동적 항목으로 바뀌 었습니다.

편집 : 여러 템플릿을 허용 목록 상자에서 상속되는 사용자 지정 컨트롤을 만드는 방법을 보여 여러 게시물을 발견

. 어떻게 바인딩에 관계없이 항상 존재하는 정적 항목에 대한 섹션을 추가하는 사용자 지정 컨트롤을 만들 수 있습니까?

답변

1

MVVM을 수행하고 ListBox의 SelectedItem을 양방향 바인딩하는 경우 하나의 컬렉션을 ItemsSource 속성에 바인딩하는 것이 훨씬 쉽고 빠릅니다.

ViewModel의 컬렉션에 정적 항목을 미리 채울 수 있습니까? 그런 다음 동적 항목을 사용할 수있을 때 기존 항목으로 병합 할 수 있습니다 (웹 서비스에서 돌아 오는 것 등). 어쨌든 ViewModel에서 이런 종류의 논리를 원하고 ListBox와 함께 사용할 단일 목록을보기에만 표시하는 것처럼 보입니다.

+0

정적 항목은 동적 항목 (정적 항목에는 textBox가 포함되고 동적 항목에는 textBlock이 포함됨)과 다릅니다. 두 개의 데이터 템플릿을 만들어 동일한 데이터 소스의 다른 경우에 사용할 수 있습니까? – chief7

+1

DataTemplateSelector를 사용해 보셨습니까? 자세한 내용은 http://msdn.microsoft.com/en-us/library/system.windows.controls.datatemplateselector.aspx를 참조하십시오. –

+0

이것은 WPF에서만 지원됩니다. Windows Phone 7 용 Silverlight에서 작업 중입니다. – chief7

0

두 가지 유형의 항목이 있기 때문에 최선의 방법은 에 새 DependencyProperty를 추가하여 두 번째 목록을 바인딩하고 표시 할 수 있도록 사용자 지정 ListBox 하위 클래스를 만드는 것입니다.. 또한 두 번째 목록을 보통의 <ItemsPresenter/>과 동일한 ScrollViewer에 적절히 표시하려면 새로운 기본 스타일이 필요합니다. 여기

내 사용자 지정 목록 상자의 예는이를 허용하는 것입니다

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); } 
    } 
} 

당신은 다음 테마/generic.xaml을 리소스 사전에 전체 기본 목록 상자 스타일을 복사하여 기본되기 위해 수정해야 할 것 MyListBox 컨트롤의 스타일 나는 (옆은 TargetType 속성에서) 기본 스타일에서 수정있는 유일한 방법은 원래의 목록을했다에서 ScrollViewer의 내용이었다 : 당신은 내가 일반적으로 단지에 대한 ItemsPresenter를 포함에서 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> 

MyListBox에 추가 한 새로운 StaticItems DependencyProperty에 바인딩 된 새 ItemsControl을 포함하는 StackPanel로 바꿉니다. 이 ItemsControl에 대한 DataTemplate을 수정하여 TextBox를 표시했습니다. 그런 다음 일반 ItemsTemplate이있는 일반 ItemsPresenter가 ScrollViewer의 정적 목록 아래에 표시됩니다.

이 사용자 지정 ListBox는 일반 ListBox 대신에 정적 항목과 동적 항목 모두에 ViewModel의 다른 두 목록에 바인딩 할 수 있습니다.

관련 문제