【问题标题】:WPF - call a window function from a child pageWPF - 从子页面调用窗口函数
【发布时间】:2009-11-10 20:08:32
【问题描述】:

我有使用停靠面板和菜单控件的 WPF 窗口。我有根据用户 ID 创建菜单选项的代码。

在这个窗口中,我有一个包含 WPF 页面的框架。我在页面上执行所有身份验证,然后有一个用户 ID 供窗口使用。但是,我无法让父窗口“刷新”并使用新的 ID 信息创建菜单栏。当窗口加载时,我没有运行命令来显示菜单栏。我已经尝试将它放在它自己的公共函数中并从页面调用它,但这似乎不起作用。

必须有一个我缺少的窗口方法可以根据来自页面的调用来显示菜单栏。

【问题讨论】:

    标签: wpf window


    【解决方案1】:

    听起来您仍在以 WinForms 风格进行程序化思考。您所描述的内容在 WinForms 中是必要的,但在 WPF 中通常要容易得多:只需使用数据绑定即可。只要您的菜单项是从“UserID”依赖属性生成的(或基于它启用/禁用),那么您需要做的就是设置 UserID DependencyProperty,UI 将自行更新,无需额外代码。

    以下是如何将 UserID 获取到 Window 的 DependencyProperty 或上下文对象中:

    • 在您的 Window 或上下文对象中创建一个“UserID”DP
    • 使您的 Window 或您的上下文对象成为页面的 DataContext
    • 在身份验证代码的末尾,设置 DataContext.UserID(或者在页面上创建一个 UserID 属性,并通过双向绑定让 Window 绑定到它)

    在 DependencyProperty 中拥有 UserID 后,有很多方法可以在菜单项更改时自动更新它:

    • 在每个菜单项中,使用适当的转换器将其可见性绑定到窗口上的 UserID DP(使用转换器参数来区分项目),-或-
    • 使用转换器设置 ItemsSource 以便过滤您的项目,-或-
    • 创建一个 PropertyChangedCallback,在您用于菜单项的 CollectionView 上设置一个过滤器,-或-
    • 其他一些技术(还有很多其他的好方法可以做到这一点)

    对于典型情况,我们在这里讨论的 C# 代码少于 10 行,不包括 DependencyProperty 声明。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多