Wpf 如何将DataTemplate控件绑定到ObservableCollections';项目属性
我试图创建一个自定义列表框来显示一些数据,但是我找不到在DataTemplate控件和items属性之间设置绑定的正确方法 我有以下POCO课程:Wpf 如何将DataTemplate控件绑定到ObservableCollections';项目属性,wpf,vb.net,xaml,Wpf,Vb.net,Xaml,我试图创建一个自定义列表框来显示一些数据,但是我找不到在DataTemplate控件和items属性之间设置绑定的正确方法 我有以下POCO课程: 名称空间模型 公共类版本 属性Numero作为字符串 属性校验和为字符串 末级 结束命名空间 这个ViewModel类: 导入System.ComponentModel 导入System.Collections.ObjectModel 名称空间视图模型 公共类VersionViewModel 实现INotifyPropertyChanged 公共事
名称空间模型
公共类版本
属性Numero作为字符串
属性校验和为字符串
末级
结束命名空间
这个ViewModel类:
导入System.ComponentModel
导入System.Collections.ObjectModel
名称空间视图模型
公共类VersionViewModel
实现INotifyPropertyChanged
公共事件PropertyChanged为PropertyChangedEventHandler实现INotifyPropertyChanged.PropertyChanged
Private _ListaVersiones作为可观察集合(Model.Version的)
作为可观测集合的公共财产清单(Model.Version)
得到
返回
结束
设置(值为ObservableCollection(Model.Version的))
_ListaVersiones=值
NotifyPropertyChanged(“版本号”)
端集
端属性
私有子NotifyPropertyChanged(ByVal propertyName作为字符串)
RaiseEvent PropertyChanged(Me,新组件模型。PropertyChangedEventArgs(propertyName))
端接头
末级
结束命名空间
我尝试在以下XAML中使用此ViewModel:
TextBlock绑定选项给我一个错误“无法解析符号X”
正确的方法是什么
更新
以下是窗口加载的事件代码:
Class主窗口
已加载私有子窗口(发送方作为对象,e作为路由EventTargets)
将版本调整为新版本ViewModel
versiones.ListaVersiones=新的ObjectModel.ObservableCollection(属于Model.Version)()
versiones.ListaVersiones.Add(带有{.Numero=“07.0201”,.Checksum=“0450a4s6540a6s5006a5s4”的New Model.Version())
versiones.ListaVersiones.Add(带有{.Numero=“07.0207”,.Checksum=“243JKH234JH223J3406A5S4”的新Model.Version())
GridVersion.ItemsSource=versiones
端接头
末级
由于ItemsSource
设置为ObservableCollection
每个项目都将是模型。版本
类型,每个ListBoxItem
都将是DataContext
,因此在数据模板
中,您需要引用模型的属性。版本
<TextBlock Text="{Binding Path=Numero}"/>
您应该指定versiones.ListaVersiones
GridVersion.ItemsSource = versiones.ListaVersiones
另一件事是,当您为ListaVersiones
属性引发NotifyPropertyChanged
时,您需要传递ListaVersiones(确切的属性名称),而不是像现在这样传递Versiones
NotifyPropertyChanged("ListaVersiones")
由于您可以手动设置ItemsSource
,因此不需要在XAML中进行设置
ItemsSource="{Binding Source={StaticResource ViewModel}, Path=ListaVersiones}"
在加载的窗口中创建的新VersionViewModel
实例与在XAML中创建的实例不同
<vm:VersionViewModel x:Key="ViewModel"/>
ItemsSource
是ListaVersiones
所以每个项目都是版本
类型,所以
应该工作它在设计时给出相同的错误:无法解析符号编号。当应用程序被执行时,它只是关闭,没有崩溃消息(同时使用ListaVersiones.Numero和Numero)。它可能在设计时出错(有时设计者在解析正确的上下文时遇到问题),但它应该在运行时工作。如果您的应用程序关闭,我认为是出于不同的原因,那么此绑定也会出现问题。当您为ListaVersiones
属性引发NotifyPropertyChanged
时,您需要传递ListaVersiones,而不是Versiones,因为此时您已经为整个应用程序添加了其余的代码。我找不到在不显示任何错误的情况下自动关闭的理由。修复了NotifyPropertyChanged,但应用程序仍然关闭。我如何在VB代码中使用实例?如果您想手动初始化某些属性,我将不会以这种方式使用它。在主窗口中创建一个VersionViewModel
的实例,并保留在局部变量中,例如\u myVersionViewModel
。将其设置为DataContext
(Me.DataContext=\u myVersionViewModel
)并更改ItemsSource
绑定到ItemsSource=“{binding Path=ListaVersiones}”
,然后您可以执行\u myVersionViewModel.ListaVersiones=…
并且UI应该在不手动更新ItemsSource
(GridVersion.ItemsSource=..
)为什么你说你不会这样使用它(通过设置DataContext)?这样使用它有什么缺点吗?如果你想创建视图模型的实例并让它从那个点开始滚动(无需手动初始化),在XAML中创建视图模型是很好的.但是,由于您希望手动初始化ListaVersiones
,并且希望处理在XAML中创建的实例,那么您需要首先找到该资源,并处理我认为在没有手动初始化的情况下不必要的更难和更不清晰的资源,我应该在ViewModel中有一个命令来加载数据into我在某个事件中从XAML中观察到的收集。对吗?
<vm:VersionViewModel x:Key="ViewModel"/>