Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf ItemsControl绑定到ObservableCollection,在属性更改时不更新UI_Wpf_Vb.net_Itemscontrol_Updating - Fatal编程技术网

Wpf ItemsControl绑定到ObservableCollection,在属性更改时不更新UI

Wpf ItemsControl绑定到ObservableCollection,在属性更改时不更新UI,wpf,vb.net,itemscontrol,updating,Wpf,Vb.net,Itemscontrol,Updating,在经历了很多头痛和深夜之后,我已经放弃了自己解决这个问题的尝试。虽然有很多关于类似问题的文献可以找到,但我还没有找到一个精确的解决方案来解决我的特殊问题 在修改ItemsSource中项目的属性后,使用画布作为ItemsPanel获取ItemsControl以更新UI时遇到问题 我创建了一个非常干净的示例应用程序来准确地演示正在发生的事情 在我的示例应用程序中,我有一个视图'MainWindow.xaml',一个视图模型'MainWindowViewModel.vb'继承'ViewModelBa

在经历了很多头痛和深夜之后,我已经放弃了自己解决这个问题的尝试。虽然有很多关于类似问题的文献可以找到,但我还没有找到一个精确的解决方案来解决我的特殊问题

在修改ItemsSource中项目的属性后,使用画布作为ItemsPanel获取ItemsControl以更新UI时遇到问题

我创建了一个非常干净的示例应用程序来准确地演示正在发生的事情

在我的示例应用程序中,我有一个视图'MainWindow.xaml',一个视图模型'MainWindowViewModel.vb'继承'ViewModelBase.vb',最后还有一个命令委托'DelegateCommand.vb',该委托用于创建relayCommand以更新ItemsControl的ItemSource

首先,MainWindow.xaml:


如您所见,我的窗口的DataContext是MainWindowViewModel,ItemSource的绑定是LineData(位于该VM内)

此外,我有三个按钮。前两个按钮执行ICommands,而第三个按钮执行ItemsControl的后台代码刷新(这是为了调试目的,以证明ItemSource中的绑定属性正在更新,而UI没有更新)。稍后再谈

第一个按钮绑定到VM中的Command1,而第二个按钮绑定到VM中的Command2

接下来,MainWindowViewModel.vb:

导入System.Collections.ObjectModel
公共类MainWindowViewModel
继承ViewModelBase
'采样线数据变量
私有的_LineData作为可观察的集合(线结构的)=GetLineData()
公共特性线数据作为(线结构的)可观察集合
得到
返回行数据
结束
集合(值为(线结构的)可观察集合)
_LineData=值
OnPropertyChanged(“LineData”)
端集
端属性
“我命令
私有命令1作为ICommand
作为ICommand的公共只读属性Command1
得到
如果_Command1什么都不是,那么
_Command1=新的MVVM.RelayCommand(ExecuteCommand1的地址)
如果结束
返回命令1
结束
端属性
私有命令2作为ICommand
作为ICommand的公共只读属性Command2
得到
如果_Command2什么都不是,那么
_Command2=新的MVVM.RelayCommand(ExecuteCommand2的地址)
如果结束
返回命令2
结束
端属性
'i命令方法
私有子执行命令1()
'重新排列LineData(0)以在画布上生成加号
'这起作用-为集合的项目指定新值将更新画布
LineData(0)=具有{.X1=“175”、.Y1=“50”、.X2=“175”、.Y2=“150”}的新线条结构
端接头
私有子执行命令2()
'将LineData(0)放回其原始位置
'这不起作用-修改集合中项目的属性不会更新画布。。即使调用INotifyPropertyChange
LineData(0).X1=“50”
LineData(0)。Y1=“50”
LineData(0).X2=“300”
LineData(0)。Y2=“50”
OnPropertyChanged(“LineData”)
端接头
“杂项方法
私有函数GetLineData()作为(LineStructure的)ObservableCollection
Dim tmpList作为新的可观察集合(线结构)
'创建两条水平平行线
tmpList.Add(带有{.X1=“50”、.Y1=“50”、.X2=“300”、.Y2=“50”}的新线条结构)
tmpList.Add(带有{.X1=“50”、.Y1=“100”、.X2=“300”、.Y2=“100”}的新线条结构)
返回tmpList
端函数
末级
公共类线结构
公共财产X1
公共财产Y1
公共财产X2
公共财产Y2
末级
在我的viewmodel中,我立即定义了LineData(这是我的ItemsSource绑定到的),因此我们有一些ItemSource的数据,可以在执行时显示在画布中。它由一个GetLineData()函数定义,该函数只返回一个由2行组成的填充的ObservableCollection

当应用程序首次启动时,将显示两条水平平行线

LineData变量是我定义的LineStructure类的ObservableObject,它只包含X1、Y1、X2、Y2字符串,用于绑定到画布中并在画布中显示的各个对象

Command1(同样,它绑定到第一个按钮)为LineData的第一个索引指定一个新的LineStructure。当这被执行时,一切工作都非常出色;用户界面按预期更新,每个人都很高兴。这使线条在画布上显示为加号

问题从这里开始:

Command2不会像Command1那样为第一个LineData索引指定新的LineStructure,相反,它会在第一个LineData索引中单独重新定义特性。如果这是可行的,它将重新安排第一行,画布上的两行将再次水平平行

然而,这并没有更新画布/用户界面——我也不知道为什么。我读过许多文章,尝试过许多不同的解决方案,但都没有效果

如果有人能解释为什么绑定在修改属性时不更新,而不是一起重新声明LineStructure索引,请告诉我,我将不胜感激

最后要注意的一点是,我已经找到了一个解决方案,可以完成我需要的工作,但是我认为我不应该使用它。。我认为
Public Class LineStructure
    Implements INotifyPropertyChanged

    Private _x1 As String
    Public Property X1 As String
        Get
            Return _x1
        End Get
        Set(value As String)
            If _x1 = value Then Return
            _x1 = value
            OnPropertyChanged("X1")
        End Set
    End Property
End Class