是的,有办法。这不漂亮。您必须将 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);
}
我希望这会有所帮助,祝你好运。