WPF ComboBox绑定不按预期工作

4
我希望我的WPF ComboBox的ItemsSource属性绑定到MyListObject的MyList属性。问题是,当我在代码中更新MyList属性时,WPF ComboBox没有反映更新。我在执行更新后引发了PropertyChanged事件,我认为WPF应该自动响应并更新UI。我错过了什么吗?
这是CLR对象:
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

这里是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>

这里是简单的后端代码:

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

谢谢!

3个回答

3
你正在绑定一个字符串列表。该列表类没有实现Inotifyproperty接口。你应该使用ObservableCollection。 我还注意到在你的代码后台中声明了


Private obj As New MyListObject

这不是您绑定到组合框的静态资源。因此,您的添加调用将不会反映在视图中。


1
更改属性为ObservableCollection似乎对更新组合框的项源没有任何影响。 - Rob Sobers

2

ObservableCollection很可能是解决方案,但如果仍然有问题,您可以在列表更新后调用以下代码直接访问静态资源:

DirectCast(Me.FindResource("MyListObject"), ObjectDataProvider).Source = _myList

我也在想,将你的ObjectDataProvider更改为CollectionViewSource是否会改善情况。 - Dillie-O

0

尝试使用BindingList(Of T)而不是List(Of T)。

编辑:我对WPF还很陌生,但BindingList似乎并不完全解决您的问题,但它可能是朝着正确方向迈出的一步。我能够在WinForm中测试将MyListObject转换为BindingList,并将ListChanged事件引发到ComboBox中,然后更新其列表。

我找到了这个(可能)解决方案,可以将您的类包装在ObservableCollection中,这可能有助于解决您的问题

启用WCF的WPF魔力-第1部分

这是将您的对象更新为BindingList的代码。将您的代码与该资源的代码组合,应该就可以了。

Public Class MyListObject
    ...

    'Private _mylist As New List(Of String)
    Private _mylist As New BindingList(Of String)

    ...

    '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 Property MyList() As BindingList(Of String)
        Get
            Return _mylist
        End Get
        Set(ByVal value As BindingList(Of String))
            _mylist = value
        End Set
    End Property

    ...

End Class

BindingList没有实现INotifyCollectionChanged或INotifyPropertyChanged,而这是WPF正在寻找的。 - Aaron Fischer
BindingList支持“旧”的更改通知,WPF仍然尊重它。此外,当任何子对象更改时(不像ObservableCollection),BindingList将触发更改通知。另外,BindingList是IList,这很好,因为它具有LINQ能力,例如.ForEach。 - Nate Zaugg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接