WPF Binding ListBox Master/Detail
Ich kann diese Arbeit mit einer XmlDataSource aber nicht mit meinen eigenen Klassen. Alles was ich will zu tun ist, binden Sie das Listenfeld, um meine Sammlung-Instanz und verknüpfen Sie dann die textbox in der listbox, so kann ich Bearbeiten Sie den Namen der person ein (zwei-Wege). Ich habe absichtlich gehalten diese so einfach wie möglich in der Hoffnung, dass jemand in die Leerstellen zu füllen.
XAML:
<Window x:Class="WpfListTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfListTest"
Title="Window1" Height="300" Width="600">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="160"/>
<ColumnDefinition Width="3"/>
<ColumnDefinition Width="1*"/>
</Grid.ColumnDefinitions>
<DockPanel Grid.Column="0">
<ListBox />
</DockPanel>
<DockPanel Grid.Column="2">
<StackPanel>
<Label>Name</Label>
<TextBox />
</StackPanel>
</DockPanel>
</Grid>
</Window>
C# - code-behind:
namespace WpfListTest
{
///<summary>
///Interaction logic for Window1.xaml
///</summary>
public partial class Window1 : Window
{
public People MyPeeps = new People();
public Window1()
{
InitializeComponent();
MyPeeps.Add(new Person("Fred"));
MyPeeps.Add(new Person("Jack"));
MyPeeps.Add(new Person("Jill"));
}
}
public class Person
{
public string Name { get; set; }
public Person(string newName)
{
Name = newName;
}
}
public class People : List<Person>
{
}
}
Alle Beispiele auf der web zu haben scheinen, was ist effektiv eine statische Klasse Rückkehr-code-definierten Daten (wie return new Person("bla bla")), anstatt meine eigene Instanz einer Sammlung - in diesem Fall MyPeeps. Oder vielleicht bin ich nicht aussprechen die richtigen Zauberspruch.
Eines Tages, ich könnte ein plötzlicher Durchbruch für das Verständnis dieser Bindung Zeug, aber im moment verwirren mich. Jede Hilfe zu schätzen.
- Dutzende von Dingen. Anstatt zu verwirren, das Problem mit fragwürdigen code, ich habe gerade wieder von vorn begonnen, es einfach zu halten. Ich habe es tatsächlich geschafft, um die Liste der box enthalten die Elemente, die mit einem einfachen testListBox.DataContext = MyPeeps; - Anweisung, aber ich kann jetzt nicht die text-box synchronisiert. Ein Schritt vorwärts, zwei zurück.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der richtige Weg wäre, um das MVVM-Muster und erstellen Sie eine ViewModel-wie so:
Initialisieren Sie es in Ihrer Anzeige die code-behind-etwa so:
Und binden Sie die Daten wie folgt:
Die Bindung funktioniert so:
Den DataContext des Fensters selbst ist, um die ViewModel-Instanz. Da die ListBox und TextBox nicht angeben
DataContext
sind, Erben Sie es aus dem Fenster. Die Bindungen an ein Objekt immer arbeiten relativ zu derDataContext
wenn nichts anderes angegeben wird. Das bedeutet, dass dieTextBox
Bindung sieht für eine EigenschaftSelectedPerson
in seinerDataContext
(d.h., in derMainWindowViewModel
) und für eine EigenschaftName
in diesemSelectedPerson
.Die grundlegende mechanik dieses Beispiels sind wie folgt:
Die
SelectedPerson
Eigenschaft im ViewModel ist immer synchronisiert mit demSelectedItem
desListBox
und dieText
Eigenschaft desTextBox
ist immer synchronisiert mit demName
Eigenschaft desSelectedPerson
.Versuchen Sie, Ihre Erben
People
Klasse ausObservableCollection<Person>