我是WPF设置的新手,我遇到一个问题,据我所知,我已经正确设置了它,以使组合框绑定到可观察的对象集合。
当我添加或删除项目时,组合框将更新。如果我进行更改,则下拉菜单中的项目不会显示任何不同,但是如果我选择了一个已编辑的项目,则现在将显示新信息,但仅在选中时显示。
我认为我已经将对象类设置为正确使用INotifyPropertyChanged,但它似乎没有起作用。下面将附加代码,以便您可以轻松地准确看到我要描述的内容。
我正在尝试执行的操作允许用户按下按钮并使组合框内的文本更新以显示新文本。
Imports System.ComponentModel
Public Class Window2
Public _names As New System.Collections.ObjectModel.ObservableCollection(Of TestClass)
Public Sub BaseLoading() Handles MyBase.Loaded
Dim AddNewItem As New TestClass
AddNewItem.groupName = "Item " + (_names.Count + 1).ToString
_names.Add(AddNewItem)
cbo_Names.SetBinding(ItemsControl.ItemsSourceProperty, New Binding With {.Source = _names})
End Sub
Private Sub button_PreviewMouseDown(sender As Object, e As MouseButtonEventArgs)
Dim AddNewItem As New TestClass
AddNewItem.groupName = "Item " + (_names.Count + 1).ToString
_names.Add(AddNewItem)
_names(0).groupName = ("Value Changed")
End Sub
End Class
Public Class TestClasss
Implements INotifyPropertyChanged
Public _groupName As String = ""
Public Property groupName As String
Get
Return _groupName.ToString
End Get
Set(value As String)
_groupName = value
onPropertyChanged(New PropertyChangedEventArgs(_groupName))
End Set
End Property
Public Event PropertyChagned(ByVal sender As Object, ByVal e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged
Public Sub onPropertyChanged(ByVal e As PropertyChangedEventArgs)
RaiseEvent PropertyChagned(Me, e)
End Sub
End Class
XAML
<Window x:Class="Window2"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<Button x:Name="button" Content="Button" PreviewMouseDown="button_PreviewMouseDown"/>
<ComboBox x:Name="cbo_Names" Margin="30,5,30,5" IsEditable="False" ItemsSource="{Binding _names, NotifyOnSourceUpdated=True,Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="groupName" SelectedItem="{Binding _names, NotifyOnSourceUpdated=True,Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
</Window>
如果能找到所需的帮助,我将不胜感激。
答案 0 :(得分:1)
您应将数据绑定属性的名称(而不是属性的值)传递给PropertyChangedEventArgs
的构造函数:
onPropertyChanged(New PropertyChangedEventArgs("groupName"))
答案 1 :(得分:0)
如果至少使用Visual Studio 2015,则可以考虑对onPropertyChanged
例程进行以下更改:
Public Sub onPropertyChanged(<System.Runtime.CompilerServices.CallerMemberName> Optional ByVal propertyName As String)
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
End Sub
然后,在groupName
的设置器中,可以在不指定属性名称的情况下调用onPropertyChanged,它将从调用者的名称中获取(也就是说,最终将成为“ groupName”)。 / p>
实际上,这与上一个答案的作用相同,但是以一种更易于编码和维护的方式。 (与<CallerMemberName>
属性一起使用,该属性与NameOf
一起很好地工作,都使您的代码对属性名称的任何更改都更加健壮。)