2009-12-15 7 views
22

Tengo un boxbox de WPF de datos donde estoy usando la propiedad SelectedValuePath para seleccionar un valor seleccionado basado en algo que no sea el texto del objeto. Esto se explica probablemente con un ejemplo:Mostrar un valor predeterminado para un WPF de datos ComboBox

<ComboBox ItemsSource="{Binding Path=Items}" 
      DisplayMemberPath="Name" 
      SelectedValuePath="Id" 
      SelectedValue="{Binding Path=SelectedItemId}"/> 

El DataContext para esta cosa es así:

DataContext = new MyDataContext 
{ 
    Items = { 
     new DataItem{ Name = "Jim", Id = 1 }, 
     new DataItem{ Name = "Bob", Id = 2 }, 
    }, 
    SelectedItemId = -1, 
}; 

Esto es todo muy bien cuando estoy visualización de datos pre-pobladas, donde el SelectedItemId coincide con un válido Item.Id.

El problema es, en el nuevo artículo caso, donde el SelectedItemId es desconocido. Lo que hace WPF es mostrar el cuadro combinado como en blanco. No quiero esto. Quiero rechazar elementos en blanco en el cuadro combinado; Me gustaría que muestre el primer elemento en la lista.

¿Esto es posible? Podría escribir un código para ir explícitamente y configurar el SelectedItemId de antemano, pero no parece correcto tener que cambiar mi modelo de datos debido a una falla en la interfaz de usuario.

Respuesta

9

Creo que tendrá que hacer un trabajo manual aquí para obtener este comportamiento. Podría verificar el código detrás cuando muestra el ComboBox por primera vez, ya sea que el SelectedItemId coincida o no y luego cambie el índice seleccionado en función de eso. O bien, si sabe que SelectedItemId siempre será -1 cuando no hay un elemento correspondiente, podría usar un datatrigger.

Método 1:

if (!DataContext.Items.Exists(l => l.Id == DataContext.SelectedItemId)) 
{ 
    MyComboBox.SelectedIndex = 0; //this selects the first item in the list 
} 

Método 2:

<Style TargetType="ComboBox"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Path=SelectedItemId}" Value="-1"> 
      <Setter Property="SelectedIndex" Value="0"/> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 
+0

Esto sería necesario incluso si el Modo vinculante fuera oneWayToSource. Me refiero a que el objetivo no afectará al ComboBox solo al revés. Siempre quise que el ComboBox comience en el primer elemento de la Lista, pero en cambio está en blanco. –

4

se puede utilizar este disparador de estilo: si SelectedItem es nulo, se selecciona primer elemento.

<Trigger Property="SelectedItem" Value="{x:Null}"> 
    <Setter Property="SelectedIndex" Value="0"/> 
</Trigger> 
+1

no está familiarizado con los desencadenantes pero, ¿fallamos si tenemos una colección nula y establecemos Valor = "0"? Gracias – ramnz

Cuestiones relacionadas