2

让我们举一个非常简单的例子:

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

我想简单地将“CalculateProduct”的结果绑定到我的标签。我的实际用例比这要复杂一些。但是,如果我能够启动并运行它,我不仅会很高兴,而且还能弄清楚其余的事情。

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

感谢您的时间和帮助,

亚伯。

4

5 回答 5

3

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

于 2008-11-10T21:26:54.180 回答
2

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

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

我不确定这会对您有所帮助,但我在尝试使用 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);
}

我希望这会有所帮助,祝你好运。

于 2008-11-10T21:32:26.027 回答
1

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

于 2008-11-10T20:57:05.003 回答
1

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

于 2008-11-11T17:57:38.487 回答
0

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

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

于 2008-11-11T18:06:40.170 回答