Come posso associare un Listview SelectedItem ad una casella di testo utilizzando la modalità TwoWay?

StackOverflow https://stackoverflow.com/questions/4529242

Domanda

Sono molto nuovo a WPF e testare alcune cose che vorrei includere in un'applicazione che lavorerò su. Ho un ListView 2 fila (legato a una casella di testo) con i nomi di Scott Guthrie e Jon Skeet in esso. Sto cercando di selezionare "Scott Guthrie" nel ListView e l'ho popolano il TextBox. Voglio essere in grado di modificare il testo e la scheda fuori e hanno la ListView aggiornato.

Modifica :. Ho rimosso il codice dal momento che in realtà non ha aggiunto nulla alla domanda

È stato utile?

Soluzione

Wow, è davvero complicato quello che hai lì.

Questo può essere realizzato in modo molto semplice. È necessario un modello per rappresentare il programmatore, un modello al fine di tenere una lista di programmatori, e semplice legame di prendersi cura di tutto il resto.

Il modello:

public sealed class Programmer
{
    public string Name { get; set; }
}

E 'molto semplice. Un oggetto che rappresenta un programmatore con un nome. Dobbiamo incapsulare il nome all'interno di un oggetto perché le stringhe sono immutabili in .NET. Se si è tentato di legame con una singola stringa in una lista di stringhe, le modifiche non sarebbero propagarsi.

La collezione di programmatori è conservato in un ViewModel. In questo caso, io lo chiamo ViewModel, perché non ho la fantasia. Questo modello vista contiene tutto ciò che la vista si lega contro. In questo caso, la sua lista di programmatori.

public sealed class ViewModel
{
    public ObservableCollection<Programmer> Programmers { get; private set; }

    public ViewModel()
    {
        Programmers = new ObservableCollection<Programmer>();
    }
}

Il ViewModel è impostato come il DataContext del nostro punto di vista. Il DataContext scorre lungo la struttura ad albero visuale, e possiamo legare contro di essa in qualsiasi momento.

public MainWindow()
{
    var vm = new ViewModel();
    vm.Programmers.Add(new Programmer { Name = "Jon Skeet" });
    vm.Programmers.Add(new Programmer { Name = "Scott Guthrie" });
    DataContext = vm;
    InitializeComponent();
}

E 'possibile impostare il DataContext in qualsiasi modo si desidera; Lo sto facendo qui per semplicità.

Nel UI, ho semplicemente legano il ListView con l'elenco dei programmatori nel ViewModel (il DataContext, salvo diversa indicazione, è la radice del percorso vincolante). Ho poi si legano TextBox contro il SelectedItem del ListBox. Si seleziona un programmatore dalla lista, che poi diventa il SelectedItem, che posso quindi modificare il nome di.

<Window
    x:Class="Programmers.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:t="clr-namespace:Programmers"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <ListBox
            x:Name="list"
            ItemsSource="{Binding Programmers}"
            DisplayMemberPath="Name" />
        <TextBox
            Grid.Column="1"
            VerticalAlignment="Top"
            Text="{Binding SelectedItem.Name, ElementName=list}" />
    </Grid>
</Window>

Semplice, una volta a ottenere il blocco di esso.

Altri suggerimenti

Questo funziona (ad eccezione che è necessario per convalidare il testo dal momento che è possibile inserire qualsiasi testo .. un menu a discesa potrebbe essere una scelta migliore).

Visualizza:

<TabItem x:Name="RightTabPage" Header="RightModel"  DataContext="{Binding Right}">
                    <StackPanel>
                        <TextBox Text="{Binding SelectedGuru}"/>
                        <ListView SelectedItem="{Binding SelectedGuru}" ItemsSource="{Binding Gurus}"/>
                    </StackPanel>
                </TabItem>

ViewModel:

public class RightViewModel
    {
        public RightViewModel()
        {
            Gurus = new[] {"Scott Guthrie", "Jon Skeet"};
            SelectedGuru = Gurus.First();
        }

        public string SelectedGuru { get; set; }
        public IEnumerable<string> Gurus{ get; set; }
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top