【问题标题】:Catch event from item stored in a dependency property从存储在依赖项属性中的项目中捕获事件
【发布时间】:2014-03-17 14:42:45
【问题描述】:

如何从依赖属性中引发的对象中捕获事件?

例如,通常我会写这样的东西

Public Property foo1 as foo
   get
     return _foo
   end get
   set (value as foo)
     _foo = value
   end set
end property
Private WithEvents _foo as foo

Public Sub Foo_Handler() Handles _foo.SomeEvent
    'Do soemthing
End Sub

但是,您不能将依赖属性声明为 WithEvents。任何想法

【问题讨论】:

  • 是自定义控件的DP吗?
  • 是的,DP 拥有一个 ISaveView 类型的对象,该对象具有以下项:Sub Save()、Sub Cancel()、Event CloseView()、Event HasChanges()。我能够通过捕获 DP 的 OnChanged 属性来制定解决方法,然后将视图的单独副本保存在私有变量中并从中捕获事件。它有效,但感觉不对劲,而且有点做作。
  • 所以,您可以创建另一个具有 Action 或 ICommand 类型的 DP。当你的 DP 更新状态时,只需提出 Action 或 Command。另一种方法是创建新类型的自定义事件并绑定到它。所以有很多选择,选择取决于你
  • 我在下面的答案中添加了更多信息。您是否知道有任何文章对您的上述有关“新型自定义事件”的评论有更多信息?恐怕,我不明白你的意思,但我想研究一下这个选项。

标签: vb.net silverlight dependency-properties


【解决方案1】:

这是我想出的解决方案。我真的不喜欢它,感觉不对,但它有效。如果有人有更好的解决方案,请提供它作为答案。为了提供有关我的用例的更多信息,我有一个名为 OkCancelDialog 的对话框。它基本上只是一个向最终用户展示内容的占位符。当用户单击 Ok 时,调用 ISaveView 的 Save 方法,反之,当单击 Cancel 按钮时,它调用 Cancel 方法。我遇到的问题是 save 方法通常必须异步保存项目。最初我将保存方法标记为返回布尔值的函数(如果为真则关闭对话框),但问题是如果在保存过程中出现问题,OkCancelDialog 已经关闭。所以现在,我调用 Save 方法并假设所有内容都正确保存在 View 中,它会引发事件 CloseView,然后我在 OKCancelDialog 中捕获该事件以关闭对话框。

我很想听听其他选项来实现这一点。

接口 ISaveView:

Public Interface ISaveView
    Sub Cancel()
    Sub Save()
    Event CloseView()
    Event HasChanges()
End Interface

带 DP 的班级:

DP:

Public ViewProperty As DependencyProperty = DependencyProperty.Register("View", GetType(ISaveView), GetType(OkCancelDialog), New PropertyMetadata(Nothing, New PropertyChangedCallback(AddressOf OnViewChanged)))

CLR 属性:

#Region "View"
    Public Property View As ISaveView
        Get
            Return DirectCast(GetValue(ViewProperty), ISaveView)
        End Get
        Set(value As ISaveView)
            SetValue(ViewProperty, value)
        End Set
    End Property
    Public Sub OnViewChanged()
        _view = View
        OnPropertyChanged("View")
    End Sub
    Private WithEvents _view As ISaveView

    Private Sub View_HasChanges() Handles _view.HasChanges
        okButton.IsEnabled = True
    End Sub

    Private Sub View_CloseView() Handles _view.CloseView
        Me.Close()
    End Sub
#End Region

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 2014-01-02
    • 2015-07-22
    • 2015-10-17
    • 1970-01-01
    • 2021-11-10
    相关资源
    最近更新 更多