我正在编写一个WPF应用程序,需要能够将带有参数的方法调用绑定到按钮的Click事件(或等效事件)。
到目前为止,为了进行测试,我以编程方式创建按钮并将它们设置为必需的StackPanel的子项。
foreach (Page p in pages)
{
Button newTestBtn = new Button();
newTestBtn.Content = p.Title;
newTestBtn.Name = p.Name.Replace(" ", string.Empty);
newTestBtn.FontSize = 14;
newTestBtn.Margin = new Thickness(2, 0, 2, 2);
newTestBtn.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FF414141"));
newTestBtn.Click += (s, e) => { SwitchPage(p); };
hp.CreateNewTestEntry(newTestBtn);
}
在确定这远远不是最好的方法之后,我建立了一个更持久的解决方案,将ItemsControl绑定到序列化类的ObservableCollection。
不过,我遇到了一个新问题,将ICommand或RoutedEventArg应用于按钮上的Click或Command似乎根本不起作用。
foreach (Page p in pages)
{
TempCl tcl = new TempCl();
tcl.ToolName = p.Title;
tcl.TriggerEvent = SwitchPage(p);
tempHolder.Add(tcl);
}
Google和StackOverflow搜索还没有找到任何简单的方法来做到这一点,我有点卡住了。
<Button Margin="0, 0, 0, 2" Content="{Binding ToolName}" Command="{Binding TriggerEvent}" FontSize="14" Background="#FF414141"/>
有谁知道不需要添加冗长的类就能做到这一点的正确方法吗?一定有一个优雅的解决方案。
1条答案
按热度按时间2w3kk1z51#
首先,如果您希望将来的应用程序更具可维护性,您必须从学习MVVM* 方法的 * 基础知识开始。基本上,您的代码可以分为3个不同的部分:* 模型-视图模型-视图。*
正如您问题的注解中提到的,需要将Button的 Command 依赖属性绑定到 ViewModel 中的 ICommand 类型属性(应为View或Control等的DataContext),并指定 CommandParameter(它将传递给Command)。
通用 ICommand 实现(例如
DelegateCommand<T>
或RelayCommand<T>
)允许您指定参数,在您的情况下,该参数可以是描述导航目标的任何参数。您可以通过Page navigation HERE找到更详细的示例。
此外,了解和使用Prism Library可能会很有用,它提供了很多模块化功能,在单个窗口中进行视图导航等。