2013-10-02 2 views
0

페이지에 전달되는 IEnumerable이 있고 페이지에이 목록을 표시하고 목록 상자의 ItemsSource를 설정하면 문자열 목록이 표시됩니다. 표시된ItemsControl의 항목에 대한 템플릿을 작성하는 방법

하지만 각 항목 옆에 체크 박스를 추가하여 확인란을 선택할 수있는 문자열을 만들 수 있습니다 (Android에 SMS에 연락처를 추가하는 방법처럼). 거기에 두 개의 목록 상자를 놓고 스크롤을 서로 바인딩 한 다음 ItemsSource 중 하나를 IEnumerable로 설정하고 두 번째 목록 상자 foreach 항목에 확인란을 추가 할 수 있습니다. 그러나 그것은 어색하다!

이제이 컨트롤에 대해 더 나은 컨트롤이 나왔습니다. ItemsControl 또는 ListBox (ListBox는 ItemsControl입니다)? 그리고 나서 어떻게 ListBox/Itemscontrol의 항목에 대한 템플릿을 작성할 수 있습니까?

인터넷을 검색 한 결과 데이터 템플릿으로 예제를 찾았습니다. 하지만 바인딩 할 데이터가 없습니다! IEnumerable을 페이지에 전달한 다음 Listss/ItemsControl의 Itemssource를 설정합니다. ItemsControl/Listbox는 각 항목 옆에 체크 상자를 넣으려고합니다.

답변

1

HierarchicalDataTemplate이 답이 될 수 있습니다.

내부에 Menu 만있는 UserControl을 작성했습니다. 런타임에 삽입 될 MenuItens의 템플릿/스타일을 지정하기 위해 위에서 설명한대로 HierarchicalDataTemplate을 사용했습니다.

<UserControl.Resources> 태그 안에 다음 코드를 삽입했습니다. 코드는 실제로 수행 할 수있는 것의 간단한 미리보기 일뿐입니다. (WPF는 매우 사용자 정의 할 수 있습니다!)
코드 :

<HierarchicalDataTemplate DataType="{x:Type ViewModel:CmpMenuViewModel}" ItemsSource="{Binding MenuSubItem}" > 
     <HierarchicalDataTemplate.ItemContainerStyle> 
      <Style TargetType="MenuItem"> 
       <Setter Property="Command" Value="{Binding Comando}" /> 
       <Setter Property="CommandParameter" Value="{Binding Texto}"/> 
      </Style> 
     </HierarchicalDataTemplate.ItemContainerStyle> 
     <StackPanel Orientation="Horizontal"> 
      <Image Source="{Binding Imagem}" /> 
      <AccessText Text="{Binding Texto}" /> 
     </StackPanel> 
</HierarchicalDataTemplate> 

<StackPanel... 비트가 내 실제 템플릿입니다.
내 스타일은 <HierarchicalDataTemplate.ItemContainerStyle> 안에 있습니다. <Style TargetType=>을 실제 TargetType으로 변경하는 것을 잊지 마십시오!

0

DataTemplate의 확인란에 바인딩 가능한 속성이있는 다른 클래스로 데이터를 래핑해야합니다.

<ItemsControl ItemsSource="{Binding YourList}"> 
    <ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <CheckBox Content="{Binding TextValue}" 
       IsChecked="{Binding IsChecked}" /> 
    </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

IEnumerable에서의 각 항목에 대한 뷰 모델처럼 보일 수 있습니다 : 예를 들어

class Checkable : ViewModelBase { 

    private bool _isChecked; 
    private string _textValue; 

    public bool IsChecked { 
     get { 
     return _isChecked; 
     } 
     set { 
     _isChecked = value; 
     OnPropertyChanged("IsChecked"); 
     } 
    } 

    public string TextValue { 
     get { 
     return _textValue; 
     } 
     set { 
     _textValue = value; 
     } 
    } 
    } 

같은 IEnumerable을있을 것입니다 당신의 UserControl의 뷰 모델 :

public List<Checkable> YourList; 

ListBox 또는 ItemsControl 사용 여부는 사용자가 어떤 유형의 기능을 사용하는지 전자 찾고 (ItemsControl 당신이 비록 여기에 찾고있는 것)입니다.

관련 문제