ComboBox.SelectedValue没有从绑定源更新的内容
ComboBox.SelectedValue没有从绑定源更新的内容
下面是我的绑定源对象:
Public Class MyListObject Private _mylist As New ObservableCollection(Of String) Private _selectedName As String Public Sub New(ByVal nameList As List(Of String), ByVal defaultName As String) For Each name In nameList _mylist.Add(name) Next _selectedName = defaultName End Sub Public ReadOnly Property MyList() As ObservableCollection(Of String) Get Return _mylist End Get End Property Public ReadOnly Property SelectedName() As String Get Return _selectedName End Get End Property End Class
这是我的XAML:
这是代码后台:
Class Window1 Private obj1 As MyListObject Private obj2 As MyListObject Private odp As ObjectDataProvider Public Sub New() InitializeComponent() Dim namelist1 As New List(Of String) namelist1.Add("Joe") namelist1.Add("Steve") obj1 = New MyListObject(namelist1, "Steve") Dim namelist2 As New List(Of String) namelist2.Add("Bob") namelist2.Add("Tim") obj2 = New MyListObject(namelist2, "Tim") odp = DirectCast(Me.FindResource("MyListObject"), ObjectDataProvider) odp.ObjectInstance = obj1 End Sub Private Sub btn_List1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btn_List1.Click odp.ObjectInstance = obj1 End Sub Private Sub btn_List2_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btn_List2.Click odp.ObjectInstance = obj2 End Sub End Class
当窗口首次加载时,绑定正常工作。ComboBox中包含名称“Joe”和“Steve”,默认情况下选择“Steve”。然而,当我点击按钮将ObjectInstance切换为obj2时,ComboBox的ItemsSource在下拉列表中正确填充,但SelectedValue被设置为Nothing,而不是等于obj2.SelectedName。
问题描述:ComboBox的SelectedValue属性没有从绑定源更新。
问题原因:在绑定时,没有显式地设置UpdateSourceTrigger为PropertyChanged。默认情况下,UpdateSourceTrigger的值为LostFocus,因此当绑定的属性值发生变化时,ComboBox的SelectedValue属性不会立即更新。
解决方法:在绑定中设置UpdateSourceTrigger为PropertyChanged,并将Mode设置为TwoWay。通过这样的设置,当绑定的属性值发生变化时,ComboBox的SelectedValue属性会立即更新。
示例代码如下:
通过以上设置,ComboBox的SelectedValue属性会在绑定的属性值发生变化时立即更新,解决了ComboBox.SelectedValue not updating from binding source的问题。
问题的原因是ComboBox的SelectedValue属性没有从绑定源更新。这可能是因为ComboBox的SelectedValue属性绑定的是ComboBox的SelectedValue属性,而不是ComboBox的Text属性。所以当你选择一个新的项时,ComboBox的Text属性会更新,但是ComboBox的SelectedValue属性不会更新。
解决这个问题的方法是将ComboBox的SelectedValue属性绑定到ComboBox的Text属性,而不是ComboBox的SelectedValue属性。这样,当你选择一个新的项时,ComboBox的Text属性会更新,然后通过绑定将更新的值传递给ComboBox的SelectedValue属性。
以下是修改后的代码:
public class TestCode { private string _test; public string Test { get { return _test; } set { _test = value; NotifyPropertyChanged(() => Test); // NotifyPropertyChanged("Test"); if not using Caliburn } } }
通过这种修改,当你选择一个新的项时,ComboBox的Text属性会更新,然后通过绑定将更新的值传递给ComboBox的SelectedValue属性,从而解决了ComboBox.SelectedValue属性不更新的问题。
问题:ComboBox的SelectedValue绑定源没有更新。
原因:根据文章中的讨论,发现SelectedValue在更新其内部时存在问题。如果设置SelectedValue,它不会看到变化,而是必须设置SelectedItem才能正确更新。作者的结论是SelectedValue设计用于获取操作而不是设置操作,但这可能只是3.5sp1 .net当前版本中的一个bug。同样在.NET 4中仍存在此问题,最好只依赖于SelectedItem而不是SelectedValue。作者在.NET 4.5中也遇到了SelectedValue的问题,对他来说,SelectedItem也解决了问题。还有一个用户遇到了与之相反的问题,他只使用SelectedItem而不使用SelectedValue,但这个回答解决了问题,它实际上做了这两个人认为SelectedValue应该做的事情,但对问题的原因有误解。问题是SelectedValue需要SelectedValuePath,这在文档中有记录。SelectedValue和SelectedItem执行不同的操作。另外,通过将UpdateSourceTrigger设置为PropertyChanged来解决了这个问题,这在我的情况下有效。我认为我需要设置这个值实在太荒谬了。
解决方法:根据文中的讨论,解决这个问题的方法主要有两种:
1. 使用SelectedItem代替SelectedValue来进行绑定操作。
2. 在SelectedValue的绑定中添加UpdateSourceTrigger=PropertyChanged来更新绑定源。
以上就是关于ComboBox的SelectedValue绑定源没有更新问题的原因和解决方法的整理。