【发布时间】:2019-12-04 18:03:51
【问题描述】:
我正在尝试在 WPF 个人理财应用中实现以下目标:
我想在不同的地方显示一个用户控件,提供资产持有的详细信息(通常是股票、债券等),目标资产可能会被用户动态更改,在这种情况下必须刷新控件。每个资产都有一个唯一标识符 AssetId。
我正在使用 MVVM,并且我开发了一个带有视图模型的单个窗口,该视图模型将 AssetID 作为参数(属性)并检索相关详细信息以绑定到视图。这工作很好。我想做的是制作一个具有相同功能的通用用户控件,这样我基本上可以将该“窗口”放在其他窗口中。
所以我几乎将该表单中的 XAML 复制粘贴到用户控件中,我正在努力将 AssetId 从父窗口传递到子控件。
Google 告诉我我需要一个依赖属性,这就是我所在的位置
Public Class HoldingView
Private _AssetId As Integer
Public AssetIdProperty As DependencyProperty = DependencyProperty.Register("AssetId",
GetType(Integer),
GetType(HoldingView),
New FrameworkPropertyMetadata(New PropertyChangedCallback(AddressOf AssetIDChanged)))
Public Property AssetId As Integer
Get
Return GetValue(AssetIdProperty)
End Get
Set(value As Integer)
SetValue(AssetIdProperty, value)
End Set
End Property
Private Sub AssetIDChanged(d As DependencyObject, e As DependencyPropertyChangedEventArgs)
Dim NewAssetId As Integer
NewAssetId = e.NewValue
Me.DataContext.AssetId = NewAssetId
End Sub
Public Sub New()
' This call is required by the designer.
InitializeComponent()
Me.DataContext = New HoldingViewmodel
End Sub
End Class
这样称呼:
<Grid>
<local:HoldingView AssetId="{Binding AssetId}"/>
</Grid>
代码编译并运行,但是当我尝试加载具有用户控件的窗口时,应用程序崩溃并显示以下消息:
不能在“HoldingView”类型的“AssetId”属性上设置“绑定”。只能在 DependencyObject 的 DependencyProperty 上设置“绑定”。
这不是很有帮助。从我的谷歌搜索中,如果 DP 注册的语法不正确,您也可以收到此消息,但在我没有经验的情况下看起来不错...
其他人有这个吗?
【问题讨论】:
标签: wpf vb.net xaml dependency-properties