texto - obtener el item seleccionado de un combobox c#
Cómo obtener una propiedad particular del artículo seleccionado en ListBox (2)
Tengo lo siguiente:
<ListBox SelectedItem="{Binding SelectedItem}"
ItemsSource="{Binding items}" DisplayMemberPath="s"/>
<TextBlock Text="{Binding SelectedItem.s}"/>
Esta es la definición de SelectedItem
public MemEntity SelectedItem {get; set;}
MemEntity
es una clase que contiene
public String s {get; get;}.
Básicamente, quiero que s del elemento seleccionado se muestre en TextBlock
(la misma propiedad que se muestra en ListBox
). Esto no funciona, entonces ¿qué estoy haciendo mal?
Hay múltiples formas de hacer esto. Ya se ha proporcionado una opción en otra respuesta que se centra en lograr la funcionalidad deseada mediante el enlace a un elemento de vista. Aquí hay otra opción.
La vista no sabe que el elemento seleccionado ha cambiado. ver en el uso de INotifyPropertyChanged
Puede crear un ViewMode de base para encapsular la funcionalidad repetida
public abstract class ViewModelBase : INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged = delegate { };
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) {
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
Haga heredar los modelos de vista de esta clase base para que la vista tenga en cuenta los cambios cuando se vincula.
public class ItemsViewModel : ViewModelBase {
public ItemsViewModel() {
items = new ObservableCollection<MemEntity>();
}
private MemEntity selectedItem;
public MemEntity SelectedItem {
get { return selectedItem; }
set {
if (selectedItem != value) {
selectedItem = value;
OnPropertyChanged(); //this will raise the property changed event.
}
}
}
public ObservableCollection<MemEntity> items { get; set; }
}
La vista ahora tendrá en cuenta cuando la propiedad SelectedItem
cambie y actualizará la vista en consecuencia.
Prueba esto,
<TextBlock ... Text="{Binding ElementName=items, Path=SelectedItem.s}" />
luego agrega un nombre a tu ListBox como,
<ListBox x:Name="items" SelectedItem="{Binding SelectedItem}"
ItemsSource="{Binding items}" DisplayMemberPath="s"/>