c# - visual - Come ottenere proprietà particolari dall'elemento selezionato in ListBox




lista combobox (2)

Ci sono molti modi per farlo. Un'opzione è già stata fornita in un'altra risposta che si concentra sul raggiungimento della funzionalità desiderata legandosi a un elemento vista. Ecco un'altra opzione.

La vista non è a conoscenza che l'elemento selezionato è cambiato. esaminare utilizzando INotifyPropertyChanged

È possibile creare un ViewModel di base per incapsulare le funzionalità ripetute

public abstract class ViewModelBase : INotifyPropertyChanged {
    public event PropertyChangedEventHandler PropertyChanged = delegate { };

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

Lascia che i modelli di visualizzazione ereditino da questa classe di base per consentire alla vista di essere a conoscenza delle modifiche durante l'associazione.

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 sarà ora consapevole quando mai la proprietà SelectedItem cambia e aggiornerà la vista di conseguenza.

Ho il seguente:

<ListBox SelectedItem="{Binding SelectedItem}"
ItemsSource="{Binding items}" DisplayMemberPath="s"/>

<TextBlock Text="{Binding SelectedItem.s}"/>

Questa è la definizione di SelectedItem

public MemEntity SelectedItem {get; set;}

MemEntity è una classe che contiene

public String s {get; get;}.

Fondamentalmente, voglio che l'elemento selezionato sia mostrato in TextBlock (stessa proprietà mostrata in ListBox ). Questo non funziona, quindi cosa sto sbagliando?


Prova questo,

<TextBlock ... Text="{Binding ElementName=items, Path=SelectedItem.s}" />

quindi aggiungi un nome al tuo ListBox come,

  <ListBox x:Name="items" SelectedItem="{Binding SelectedItem}"
        ItemsSource="{Binding items}" DisplayMemberPath="s"/>




listbox