2011-05-05 5 views
5

이 XAML 있습니다 :항목이 ListView에 추가되면 이벤트가 발생합니까?

<ListView Name="NameListView" 
      HorizontalAlignment="Stretch" 
      VerticalAlignment="Stretch" 
      Grid.Column="1"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn> 
       <GridViewColumn.DisplayMemberBinding> 
        <MultiBinding StringFormat="{}{0} {1}"> 
         <Binding Path="First" /> 
         <Binding Path="Last" /> 
        </MultiBinding> 
       </GridViewColumn.DisplayMemberBinding> 
      </GridViewColumn> 
     </GridView> 
    </ListView.View> 
</ListView> 

ObservableCollection<Name> "이름"내 코드 숨김에 ListView 바인딩합니다. 새 새 이름이 컬렉션에 추가되면 ListView에서 새로 추가 된 이름의 배경색을 변경합니다. 어떻게해야합니까?

+3

Welcome to StackOverflow! 내가 당신을 위해 질문에 코드 서식을 고정했습니다. 잠시 시간을내어 Ask Ask 질문 영역의 오른쪽 ** 서식 방법 ** 상자를 읽고 ** [페이지 링크 됨] (http://stackoverflow.com/editing-help) ?] ** 질문 영역 바로 위에 있습니다. (질문을 미리 볼 수있는 Ask a Question 상자 아래에 미리보기 상자가 있습니다.) –

답변

15

listbox.Items 속성에서 ItemsChanged 이벤트에 가입 할 수 있습니다. 먼저 캐스팅해야하기 때문에 약간 까다 롭습니다. 구독하는 코드는 다음과 같습니다

((INotifyCollectionChanged)MainListBox.Items).CollectionChanged += ListBox_CollectionChanged; 

을 그리고 해당 이벤트 내에서이 같은 코드를 사용하여 아이템을 얻을 수 있습니다 :

private void ListBox_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     if (e.NewItems.Count > 0) 
     { 
      Dispatcher.BeginInvoke(() => 
      { 
       var newListItem = MainListBox.ItemContainerGenerator.ContainerFromItem(e.NewItems[0]) as Control; 
       if (newListItem != null) 
       { 
        newListItem.Background = System.Windows.Media.Brushes.Red; 
       } 
      }, DispatcherPriority.SystemIdle); 
     } 
    } 
+1

1. ListBox가 아니라 ListView 2. 포 그라운드가 아닌 배경입니다. 3. 어느 곳에서나 이러한 이벤트를 볼 수 없습니다. 제어. –

+0

더 명확하게하기 위해 위의 코드를 수정했습니다. 또한이 모든 ItemsControl (ListBox 또는 ListView) 함께 작동합니다. –

+1

나는 이것이 잘 풀리지 않을 것이라고 확신한다. ListItem은 ListBox 또는 ListView와 아무 관련이없는 Documents 컨트롤이므로 ListItem으로 캐스팅하는 일은 절대로 없을 것입니다. –

1

직접있는 ListViewItem의 배경을 설정하는 것은 좋지 않다 아이디어는 기본적으로 ListView가 가상화 (좋은)이기 때문에 항목을 구성하는 컨트롤이 스크롤하지 않고 볼 때 삭제된다는 것을 의미합니다. 이 작업을 수행하는 가장 쉬운 방법은 New-state를 나타내는 데이터 객체에 속성이있는 것으로 생각할 수 있다는 것입니다.

<ListView.ItemContainerStyle> 
    <Style TargetType="{x:Type ListViewItem}"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding IsNew}" Value="True"> 
       <Setter Property="Background" Value="Yellow"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</ListView.ItemContainerStyle> 

그러면 더 이상 새로운 값으로 간주하지 않으면 해당 값을 false로 설정하려는 논리를 다시 사용할 수 있습니다.

관련 문제