WPF - binden Sie eine listbox an eine Liste<string> - was mache ich falsch?
Ich versuche zu tun, etwas sehr grundlegendes, das ich nicht erwartet hätte, um mir diese vielen Probleme. Ich habe eine öffentliche Eigenschaft auf mein Hauptfenster-Klasse genannt, ItemList vom Typ List<string>
. Ich zu dieser Liste hinzufügen während der gesamten Lebensdauer des Programms, und möchte das ListBox-Steuerelement auf meinem Formular automatisch aktualisieren, wenn ich neue Elemente hinzufügen, um die ItemList-Eigenschaft.
Bisher habe ich die folgenden XAML-Code:
<Window x:Class="ElserBackupGUI.Main"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Backup Profile Editor [New Profile]" Height="480" Width="640">
<DockPanel>
<Menu DockPanel.Dock="Top">
<MenuItem Header="File">
<MenuItem Header="Open"/>
</MenuItem>
</Menu>
<StackPanel Orientation="Vertical" DockPanel.Dock="Top" Margin="10 10 10 3">
<TextBlock>Items to backup:</TextBlock>
</StackPanel>
<DockPanel DockPanel.Dock="Bottom" Margin="10 0 10 10">
<StackPanel Orientation="Horizontal">
<Button Name="AddDirectoryButton" Height="22.725" Width="120" Margin="0 0 6 0" Click="AddDirectoryButton_Click">Add Directory...</Button>
<Button Name="AddFileButton" Height="22.725" Width="90" Margin="0 0 6 0" Click="AddFileButton_Click">Add File...</Button>
<Button Name="RemoveDirectoriesButton" Height="22.725" Width="75.447" Margin="0 0 6 0">Remove</Button>
</StackPanel>
</DockPanel>
<ListBox Name="SelectedItems" Margin="10 0 10 10" ItemsSource="{Binding Path=ItemList}"/>
</DockPanel>
</Window>
Den relevanten code-behind-code sieht wie folgt aus:
public partial class Main : Window
{
private string _lastFolder = string.Empty;
private ObservableCollection<string> _itemList = new ObservableCollection<string>();
public ObservableCollection<string> ItemList {
get { return _itemList ?? (_itemList = new ObservableCollection<string>()); }
set { _itemList = value; }
}
public Main()
{
InitializeComponent();
ItemList.Add("test item");
DataContext = this;
}
private void AddDirectoryButton_Click(object sender, RoutedEventArgs e)
{
FolderBrowserDialog dialog = new FolderBrowserDialog();
if (!string.IsNullOrEmpty(_lastFolder))
dialog.SelectedPath = _lastFolder;
if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
_lastFolder = dialog.SelectedPath;
ItemList.Add(dialog.SelectedPath);
}
}
private void AddFileButton_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog dialog = new OpenFileDialog();
if (!string.IsNullOrEmpty(_lastFolder))
dialog.InitialDirectory = _lastFolder;
if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
_lastFolder = System.IO.Path.GetDirectoryName(dialog.FileName);
SelectedItems.ItemsSource = null;
ItemList.Add(dialog.FileName);
}
}
}
Ich bin relativ neu in WPF und die meisten tutorials scheinen übermäßig kompliziert für so ein einfaches problem. Ich kann nicht scheinen, um überall zu bekommen - was bin ich?
InformationsquelleAutor Chris | 2009-09-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie verwenden
BindingList<T>
oderObservableCollection<T>
stattList<T>
.Das problem ist, dass für die Bindung zu arbeiten, wie Sie wollen, braucht es zur Umsetzung
, INotifyCollectionChanged
oderIBindingList
.List<T>
unterstützt dies nicht.Edit:
Nach der überprüfung Ihrer änderungen, es ist immer noch ein problem.
In der AddFileButton_Click event-handler, entfernen Sie die folgende Zeile:
Es ist explizit entfernen Ihre Bindung, und was das Listenfeld zu löschen. Wenn Sie zu entfernen, dass Ihr code sollte funktionieren.
Jedoch, ich empfehlen, ändern Sie Ihre Sammlung-definition und-Konstruktor mehr etwas wie:
Ich erwähne beide, und glauben, dass Sie beide bieten Vorteile. Ich in der Regel Zustimmen und empfehlen, ObservableCollection, aber wenn Sie Ihre Sammlung kann verwendet werden, durch nicht-WPF-Anwendungen sowie, BindingList bieten kann Vorteile.
Ich habe versucht, ändern der Liste<string> ObservableCollection<string> und nichts hat sich geändert. Es lief gut, aber das hinzufügen von Elementen der Auflistung wurde nicht aktualisiert die listbox-Steuerelement
Nehmen Sie die Abf. property-Bezeichner, wie gut es eigentlich nicht süchtig, bis das Anwesen korrekt, Sie sind also "Bindung" an die falsche Sammlung. Wenn Sie mit ObservableCollection, die Sie binden können, direkt, ohne DP.
Noch kein Würfel. Ich fange an zu Fragen, wenn ich nicht über etwas anderes geschraubt, irgendwo.
InformationsquelleAutor Reed Copsey
Ich weiß nicht, wie diese getter... persönlich. Sieht Auffällig.
Bist du schon beim initialisieren der _itemList in der Erklärung. Wenn Sie es brauchen die doppelte Zeit, um sich sicher fühlen, tun Sie es in den Konstruktor.
Ja der zusätzliche code war, bevor ich war initialisieren der Liste in der Erklärung. Ich habe entfernt die redundanten code jetzt.
InformationsquelleAutor Jacob