2016-10-05 2 views
0

저는 WPF에 비교적 신선하고 XAML을 발견했습니다.ListBox의 선택된 항목 만 새 목록에 표시합니다.

XAML (아래 참조)에 ListBox Name="EmployeeTitles"이 하나 있습니다. 문제를 시연 할 목적으로 ObservableCollection<Employee>DataContext = employees입니다. 다음과 같이

 <ListBox Name="EmployeeTitles" 
      ItemsSource="{Binding}" 
      SelectionMode="Extended"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal"> 
         <ToggleButton IsChecked="{Binding IsSelected, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}"> 
          <!--StackPanel will have more items--> 
          <StackPanel Orientation="Horizontal"> 
           <TextBlock Text="{Binding Title}"/> 
          </StackPanel>       
         </ToggleButton> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 

내 "코드 뒤에"클래스 조각은 같습니다

private string _title; 
public string Title 
{ 
    get { return _title; } 
    set 
    { 
     _title = value; 
     OnPropertyChanged(); 
    } 
} 

private bool _isSelected; 
public bool IsSelected 
{ 
    get 
    { 
     return _isSelected; 
    } 
    set 
    { 
     _isSelected = value; 
     OnPropertyChanged(); 
    } 
} 

내가 다른 컨트롤에서 선택한 항목을 표시하고 싶습니다. 예를 들어 선택한 항목 만 표시하는 목록이 있습니다. XAML에서 IsChecked="True" 인 항목 만 표시한다고 어떻게 든 표시 할 수 있습니까? 내가 선택한 항목을 저장하고 다른 "ObservableCollection"속성을 때마다 IsSelected 변경 때마다 그것을 업데이트 할 수있는 알고 있지만 오버 헤드를 것 같아요 및 거기에 XAML 할 방법이 있어야할까요?

답변

3

다른 목록 상자를 원래 목록 상자의 선택한 항목과 바인딩 할 수 있습니다. 아래 코드를 사용해보십시오.

<Grid> 
    <StackPanel Orientation="Horizontal"> 
     <ListBox x:Name="Emp" ItemsSource="{Binding EmpCollection}" SelectionMode="Extended"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal"> 
         <ToggleButton IsChecked="{Binding IsSelected, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}"> 
          <!--StackPanel will have more items--> 
          <StackPanel Orientation="Horizontal"> 
           <TextBlock Text="{Binding Title}"/> 
          </StackPanel> 
         </ToggleButton> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
     <ListBox x:Name="SelectedEmp" ItemsSource="{Binding ElementName=Emp,Path=SelectedItems}" DisplayMemberPath="Title"/> 
    </StackPanel> 
</Grid> 

public partial class Window2 : Window 
{ 
    public Window2() 
    { 
     InitializeComponent(); 
     this.DataContext = new ViewModel(); 
    } 
} 


class ViewModel 
{ 
    public ObservableCollection<Emp> EmpCollection { get; set; } 

    public ViewModel() 
    { 
     EmpCollection = new ObservableCollection<Emp>(); 
     for (int i = 0; i < 10; i++) 
     { 
      EmpCollection.Add(new Emp() {Title = "Title"+i}); 
     } 
    } 

} 

class Emp:INotifyPropertyChanged 
{ 
    private string _title; 
    public string Title 
    { 
     get { return _title; } 
     set 
     { 
      _title = value; 
      OnPropertyChanged(); 
     } 
    } 

    private bool _isSelected; 
    public bool IsSelected 
    { 
     get 
     { 
      return _isSelected; 
     } 
     set 
     { 
      _isSelected = value; 
      OnPropertyChanged(); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    [NotifyPropertyChangedInvocator] 
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 

    } 
} 
+0

당신은'ListBox.SelectedItems'를 바인딩 할 수 없습니다. –

+1

당신이 할 수있는 요소 바인딩을 사용하여 .. 내 완전한 코드를 시도해 .. –

+0

나는 서서. 아주 멋지다. 그래도 여전히 뷰티 모델로 되돌려 보내야합니다. –

관련 문제