Ich weiß, dass das eine ziemlich lange Frage ist, aber ich sah hier keinen anderen Weg, als meinen Code zu posten, den ich aus Gründen der Klarheit so kurz und einfach wie möglich zu halten versuchte. Natürlich Tonnen bewährten Verfahren, dies zu tun verletzt werden, ist das Beispiel, lange genug, wie es ist ..Wie listet Listview sich in WPF auf?
ich eine sehr einfache WPF-Anwendung aus, die
- zeigt eine Liste von Personen auf der linke Seite von der Bildschirm (Format: Name und Alter zwischen())
- zeigt alle Eigenschaften der ausgewählten Person auf der rechten Seite des Bildschirms
- auf der rechten Seite, um die Eigenschaften bearbeiten und die gesamte Auswahl in einem msgbox sehen
Im folgenden Beispiel habe ich das Alter von Bar bearbeitet. In der Liste wird das Alter jedoch nicht aktualisiert. Wenn ich die zugrunde liegende Sammlung frage, scheint sie immer noch aktualisiert worden zu sein. Wie kann ich die Liste wissen lassen?
Im Folgenden sind neben einem Screenshot, den Code und die XAML
HINWEIS: wenn das Bild nicht zeigt, versuchen Sie es in einem neuen Tab oder Fenster zu öffnen.
namespace ASAPBinding
{
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public override string ToString()
{
return String.Format("{0} ({1})",Name,Age);
}
}
}
namespace ASAPBinding
{
public class Dal
{
public ObservableCollection<Person> Persons { get; set; }
public Dal()
{
Persons = new ObservableCollection<Person>();
Persons.Add(new Person() {Name = "Bar", Age = 25});
Persons.Add(new Person() {Name = "Foo", Age = 50});
}
public void PrintOutCollection()
{
MessageBox.Show(
Persons[0].ToString() + "\n" + Persons[1].ToString()
);
}
}
}
<Window x:Class="ASAPBinding.EditPersons"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ASAPBinding"
x:Name="window1"
Title="EditPersons" Height="300" Width="300">
<Window.Resources>
<local:Dal x:Key="dal"/>
</Window.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*" />
<ColumnDefinition Width="1*" />
</Grid.ColumnDefinitions>
<ListBox Name="ListBox1"
ItemsSource="{Binding Source={StaticResource dal}, Path=Persons, Mode=TwoWay}"
Grid.Column="0"/>
<StackPanel
DataContext="{Binding ElementName=ListBox1, Path=SelectedItem, Mode=TwoWay}"
Grid.Column="1" Margin="0,0,0,108">
<TextBox Text="{Binding Path=Name}" />
<TextBox Text="{Binding Path=Age}" />
<Button Click="Button_Click">Show Collection</Button>
</StackPanel>
</Grid>
</Window>
public partial class EditPersons : Window
{
public EditPersons()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Dal dal = (Dal) window1.FindResource("dal");
dal.PrintOutCollection();
}
}
oder erben von DependencyObject –
Nein, das nicht genug ist, wird der Wert gebunden muss entweder ein * DependencyProperty * sein (auf einem DependencyObject) oder der besitzende Typ muss INotifyPropertyChanged (richtig) implementieren. –
Ja, die Grundlagen werden leicht übersehen. Bearbeitete meine Antwort. –