2011-05-05 18 views
5

tengo unas pocas cosas XAML:¿Evento disparado cuando el elemento se agrega a 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> 

y un ObservableCollection<Name> llamado "nombres" enganchan a la ListView en mi código subyacente. Cuando se agrega un nuevo nombre nuevo a la colección, quiero que ListView cambie el color de fondo de ese nombre recién agregado. ¿Cómo hago para hacerlo?

+3

¡Bienvenido a StackOverflow! He arreglado el formato del código en la pregunta para ti. Tómese un momento para leer el práctico cuadro ** Cómo formatear ** a la derecha del área Hacer una pregunta, y [la página vinculada] (http://stackoverflow.com/editing-help) del ** [ ?] ** justo encima del área de preguntas. (También hay un cuadro de vista previa que se muestra en el cuadro Preguntar una pregunta, donde puede obtener una vista previa de su pregunta.) –

Respuesta

15

Puede suscribirse al evento ItemsChanged en la propiedad listbox.Items. Esto es un poco complicado porque tienes que lanzarlo primero. El código para suscribirse podría tener este aspecto:

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

y luego dentro de ese evento se puede llegar a su artículo con código como el siguiente:

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. No es un ListBox sino un ListView 2. Es el fondo, no el primer plano 3. No puedo ver un evento así en ninguna parte controlar. –

+0

Modifiqué mi código anterior para que quede más claro. También esto debería funcionar con cualquier ItemsControl (ListBox o ListView). –

+1

Estoy bastante seguro de que esto no funcionará. Por un lado, la conversión a ListItem nunca va a funcionar porque ListItem es un control de Documentos que no tiene nada que ver con ListBox o ListView. –

1

Ajuste del fondo de un ListViewItem directamente no es un buen idea porque por defecto un ListView se está virtualizando (lo cual es bueno), eso significa que los controles que componen los elementos se eliminan cuando se desplazan fuera de la vista. La forma más fácil de hacer esto es que puedo pensar en tener una propiedad en su objeto de datos que indique el estado nuevo, luego puede activarlo.

<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> 

A continuación, puede utilizar cualquier lógica que desee para establecer ese valor en falso si ya no lo considera nuevo.

Cuestiones relacionadas