WPF组合框项目更新

时间:2018-11-02 15:08:25

标签: wpf vb.net

我是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>

如果能找到所需的帮助,我将不胜感激。

2 个答案:

答案 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一起很好地工作,都使您的代码对属性名称的任何更改都更加健壮。)