【问题标题】:Is there a way to bind the results of a public method in xaml.cs to a control in xaml?有没有办法将 xaml.cs 中的公共方法的结果绑定到 xaml 中的控件?
【发布时间】:2010-09-21 16:45:27
【问题描述】:

我们举个很简单的例子:

  • 在我的 window1.xaml 中,我有一个标签 名为“lblProduct”的控件。
  • 在我的 window1.xaml.cs 中,我有一个 公共方法称为 计算乘积(Int Var1,Int 变量 2)。 CalculateProduct 将,如 你可能已经猜到了,计算 传入变量的乘积。

我想简单地将“CalculateProduct”的结果绑定到我的标签。我的实际用例比这要复杂一些。但是,如果我能够启动并运行它,我不仅会很高兴,而且还能解决剩下的问题。

我看到过使用 ObjectDataProvider 绑定到新类的静态方法的有趣示例。虽然这很好,但当我已经为我的窗口实例化了一个新类时,我觉得不需要创建一个新类。此外,我可能希望在 Window1 类中利用其他全局变量。

感谢您的时间和帮助,

亚伯。

【问题讨论】:

    标签: wpf data-binding xaml binding


    【解决方案1】:

    它又快又脏,但我可能只是让CalculateProduct 设置一个属性及其结果并将数据绑定到该属性。

    【讨论】:

    • 谢谢,我认为这是一个解决方案,但我希望我错过了一些超级简单的方法。好主意。
    【解决方案2】:

    是的,有办法。这不漂亮。您必须将 xmlns:Commands 属性添加到 window1.xaml 标记。我最终将在this Code Project article 中找到的一些代码混为一谈。

    您希望在标签中显示的产品是在加载时生成的,还是从另一个控制事件生成的?

    我不确定这会对您有所帮助,但我在尝试使用 XSLT 动态生成 XAML 时遇到了类似的情况。我的解决方案奏效了,有点……嗯,不是我想要做的。但也许它会对你有所帮助。

    正如我所说,您必须在页面标签中声明 xmlns,如下所示:

    <Page x:Class="WpfBrowserApplication1.Page1" 
      blah blah blah 
      xmlns:Commands="clr-namespace:WpfBrowserApplication1">
    

    然后,在您的应用程序中定义一个具有相同命名空间的静态类,与代码项目文章中的示例几乎相同,并带有 RoutedUICommand 的处理程序:

    namespace WpfBrowserApplication1
    {
        public static class CommandHandlers
        {
            private static System.Windows.Input.RoutedUICommand _submitCommand;
    
            static CommandHandlers()
            {
                _submitCommand = new System.Windows.Input.RoutedUICommand("Submit", "SubmitCommand", typeof(CommandHandlers));
            }
    
            public static void BindCommandsToPage(System.Windows.Controls.Page caller)
            {
                caller.CommandBindings.Add(new System.Windows.Input.CommandBinding(SubmitCommand, SubmitContact_Executed, SubmitContact_CanExecute));
            }
    
            public static System.Windows.Input.RoutedUICommand SubmitCommand
            {
                get { return _submitCommand; }
            }
    
            public static void SubmitContact_Executed(object sender, System.Windows.Input.ExecutedRoutedEventArgs e)
            {
                ...do stuff...
            }
    
            public static void SubmitContact_CanExecute(object sender, System.Windows.Input.CanExecuteRoutedEventArgs e)
            {
                if (e.Source is System.Windows.Controls.Button)
                    e.CanExecute = true;
                else
                    e.CanExecute = false;
            }
        }
    }
    

    令人讨厌的是,据我所知,将事物映射回 Page1.xaml 的唯一方法是强制转换 sender 对象并挖掘 Page 的 UI 元素,类似于挖掘的方式通过网页上的 DOM。我在这方面取得了一些成功,但当然不要假装自己是专家。

    您要做的最后一件事是在 Page1.xaml.cs 中连接您的控件。在 XAML 中,您可以这样做:

    <Button Name="btnSubmit" Command="Commands:CommandHandlers.SubmitCommand" etc... />
    

    在代码隐藏中,像这样:

    private void Page_Loaded(object sender, RoutedEventArgs e)
    {
        CommandHandlers.BindCommandsToPage(this);
    }
    

    希望对你有帮助,祝你好运。

    【讨论】:

    • 这是一个出色的 B 计划。代码的当前状态还不错。如果它使 WPF 绑定快乐,我没有想过简单地将我所有的交互移动到一个静态帮助器类中。感觉很奇怪,但如果有必要我可以克服它。
    • 我迫不及待想了解更多关于这个混蛋的信息 ;-)
    • 我不确定这是否是您正在寻找的,但我认为它可能会有所帮助。
    • 这样就可以了!我试图释放我对我想做的事情的先入为主的观念,我开始接受我需要做的事情。谢谢老兄!
    【解决方案3】:

    为什么不只是在从方法返回之前在 CalculateProduct 方法中设置标签值。基本上你在这里需要数据绑定吗?无论如何,这是一种方式,因为您要绑定到标签。

    【讨论】:

      【解决方案4】:

      ObjectDataProvider 有一个 ObjectInstance 属性,您可以将 Window 实例分配给该属性。

      【讨论】:

      • 举个例子,我会将 ObjectInstance 设置为什么? 'Window1' 和 'this' 不起作用。
      【解决方案5】:

      aogan:这里的想法是利用 WPF 数据绑定的灵活性。我可以在后面的代码中设置整个 UI,但是 MS 开发了这个绑定系统,我想轻松地利用它。此外,这是一个更复杂问题的简单示例。

      对于其他所有相关人员,我已采用 PITAdev 的解决方案。感谢您的帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-19
        • 2012-02-12
        • 1970-01-01
        • 2011-12-29
        • 1970-01-01
        • 2010-12-22
        • 1970-01-01
        • 2012-08-31
        相关资源
        最近更新 更多