.net wpf xaml targetnullvalue

.net - DataTemplate con TargetNullValue en un ListBox



wpf xaml (3)

Tengo el siguiente DataTemplate en un Listbox

<ListBox Grid.Column="1" Grid.Row="2" ItemsSource="{Binding People}" SelectedItem="{Binding SelectedPerson}"> <ListBox.ItemTemplate> <DataTemplate> <TextBlock OverridesDefaultStyle="True" Background="{x:Null}" Margin="0" Padding="0" IsHitTestVisible="True" Text="{Binding TargetNullValue=None}" /> </DataTemplate> </ListBox.ItemTemplate>

Esto funciona perfectamente, mostrando "Ninguno" en lugar de cualquier valor Nulo (Nada) en la lista encuadernada. El problema es que no puedo hacer clic en los valores nulos para seleccionarlos. La selección con el teclado funciona perfectamente, pero no con un mouse. ¿Qué puedo hacer para que los valores nulos en la lista actúen como cualquier otro valor?

Editar: También debo agregar que puedo cambiar el fondo del Bloque de Texto a Rojo y se muestra igual que los demás, así que no creo que sea un caso de no tener nada en que hacer clic. También lo he visto con Snoop y no veo ningún atributo en el árbol visual que sea diferente entre un elemento nulo y un elemento normal.

Edición 2: debería agregar que People es en realidad una clase que representa una tabla de base de datos. Utiliza el método ToString para mostrar los objetos People de forma predeterminada. Obtengo el mismo efecto si me vinculo al campo apropiado usando la opción de ruta y pensé que sería más fácil de leer.


Esto es lo que creo que está sucediendo:

Supongo que ItemSource es una colección simple de valores de strings desnudos (es decir, no encapsulados en otra clase). Cuando presiona el botón del mouse en un objeto, el código subyacente copia la referencia de objeto del elemento en la colección al campo SelectedItem del cuadro de lista.

entonces si la colección es: - "Fred", nulo, "Jane", "Mary" y presiona el mouse sobre "Fred", entonces la referencia del objeto de "Fred" se copia a SelectedItem. Si presiona sobre el segundo elemento, esa referencia de objeto (nulo) se copia a SelectedItem.

El problema es que un valor de NULL en SelectedItem realmente significa un caso especial donde no se selecciona ningún elemento.

No se copiará "Ninguno" en SelectedItem aunque esté especificado en su atributo TargetNullValue. Esto es solo una representación visual cuando el elemento de colección contiene el valor NULL. El cuadro de lista solo está interesado en las referencias a objetos de la colección, no en lo que se muestra en la interfaz de usuario.

La única forma de evitar esto es crear una colección no nula de objetos con un campo de cadena llamado "nombre".

p.ej

class People { string Name {get;set;} } ... ... var list = new List<People> {new People {Name = "Fred"}, new People {Name = null}, new People {Name = "Jane"}, };

Esto significará que ningún elemento en la Lista tendrá un valor NULL.

Luego, en la vinculación de DataTemplate use:

Text="{Binding Path=Name, TargetNullValue=None}"

El elemento seleccionado para cada elemento ahora será no NULL incluso si el nombre es NULL, pero el inconveniente para usted es que SelectedItem ya no es una cadena del nombre seleccionado sino una referencia al objeto People que se seleccionó.