WPF ComboBox-binding funktioniert nicht wie erwartet
Ich will, dass mein WPF ComboBox die ItemsSource-Eigenschaft gebunden werden, MyListObject ist MyList Eigenschaft. Das problem ist, dass wenn ich update die MyList-Eigenschaft im code der WPF ComboBox wird nicht reflektieren das update. Ich Hebe das PropertyChanged-Ereignis aus, nachdem ich das update ausführen, und ich dachte, WPF sollte automatisch reagieren, indem Sie die Aktualisierung der Benutzeroberfläche. Bin ich etwas fehlt?
Hier ist das CLR-Objekt:
Imports System.ComponentModel
Public Class MyListObject
Implements INotifyPropertyChanged
Private _mylist As New List(Of String)
Public Sub New()
_mylist.Add("Joe")
_mylist.Add("Steve")
End Sub
Public Property MyList() As List(Of String)
Get
Return _mylist
End Get
Set(ByVal value As List(Of String))
_mylist = value
End Set
End Property
Public Sub AddName(ByVal name As String)
_mylist.Add(name)
NotifyPropertyChanged("MyList")
End Sub
Private Sub NotifyPropertyChanged(ByVal info As String)
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info))
End Sub
Public Event PropertyChanged(ByVal sender As Object, _
ByVal e As System.ComponentModel.PropertyChangedEventArgs) _
Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
End Class
Hier ist das XAML:
<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300"
xmlns:local="clr-namespace:WpfApplication1"
>
<Window.Resources>
<ObjectDataProvider x:Key="MyListObject" ObjectType="{x:Type local:MyListObject}"/>
</Window.Resources>
<Grid>
<ComboBox Height="23"
Margin="24,91,53,0"
Name="ComboBox1"
VerticalAlignment="Top"
ItemsSource="{Binding Path=MyList, Source={StaticResource MyListObject}}"
/>
<TextBox Height="23"
Margin="24,43,134,0"
Name="TextBox1"
VerticalAlignment="Top" />
<Button Height="23"
HorizontalAlignment="Right"
Margin="0,43,53,0"
Name="btn_AddName"
VerticalAlignment="Top"
Width="75">Add</Button>
</Grid>
</Window>
Ist hier der einfache code-behind:
Class Window1
Private obj As New MyListObject
Private Sub btn_AddName_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) _
Handles btn_AddName.Click
obj.AddName(TextBox1.Text)
End Sub
End Class
Dank!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bindung an eine Liste von strings. Dass die list-Klasse implementiert nicht Inotifyproperty. Sollten Sie eine observablecollection statt.
Ich merke auch, im code hinter Sie erklären
Dies ist nicht das statische Ressource, die Sie gebunden in die Auswahlliste. So Ihr Anruf hinzufügen " nicht wäre, spiegelt sich in Ihrem Blick.
Die ObservableCollection ist wahrscheinlich die Lösung, aber wenn es immer noch gibt Ihnen Kummer, kann man direkt auf die statische Ressource durch den Aufruf den folgenden code nach deiner Liste aktualisiert wird:
Versuchen Sie es mit einem BindingList(Of T) statt einer List(Of T).
Edit: ich bin neu in WPF und er sieht aus wie BindingList nicht eine komplette Lösung für Ihr problem, aber es könnte ein Schritt in die richtige Richtung. Ich war in der Lage zu testen, die MyListObject umgewandelt BindingList in WinForm und das ListChanged-Ereignis ausgelöst wurde, um das Auswahlfeld, das dann aktualisiert die Liste.
Fand ich diese (mögliche) Lösung zu wickeln Sie Ihre Klasse in eine ObservableCollection, die helfen könnten, Ihr problem zu lösen
Aktivieren WPF Magie Mit WCF - Teil 1
Dies ist der code zum aktualisieren Ihres Objekts zu einer BindingList. Kombinieren Sie Ihren code mit dem code aus, dass die Ressource, und Sie sollten gut zu gehen.