如何解决如何以编程方式创建WPF按钮和传递参数
正如标题所示,我需要在WPF应用程序中以编程方式创建按钮,每个按钮都与集合中的对象相关联,以便click事件将使用该对象作为参数。
例如:
public FooWindow(IEnumberable<IFoo> foos)
{
InitializeComponent();
foreach(var foo in foos)
{
// Button creation code goes here,using foo
// as the parameter when the button is clicked
button.Click += Button_Click;
}
}
private void Button_Click(object sender,RoutedEventArgs e)
{
// Do what you need to do with the IFoo object associated
// with the button that called this event
}
到目前为止,我所见过的所有解决方案都涉及使用命令(这很好,但对于本应用程序来说似乎过于复杂),以不寻常的方式使用xaml标记,或者未解决将对象自动分配为调用click事件时应使用的参数。
我想出了一个我很满意的解决方案,所以我会回答我自己的问题,但是其他人可以根据自己的意愿提出自己的解决方案。
解决方法
我的解决方案涉及创建一个自定义按钮,该按钮继承自在实例化时分配了可公开访问的IFoo对象的Button。
class FooButton : Button
{
public IFoo Foo { get; private set; }
public FooButton(IFoo foo) : base()
{
Foo = foo;
}
}
然后将实例化此自定义按钮代替Button,并在那时分配IFoo对象。单击该按钮时,可以检索IFoo对象并将其作为参数传递,也可以根据需要使用。
public FooWindow(IEnumberable<IFoo> foos)
{
InitializeComponent();
foreach(var foo in foos)
{
var button = new FooButton(foo);
button.Click += Button_Click;
// Add the button to your xaml container here
}
}
private void Button_Click(object sender,RoutedEventArgs e)
{
if(sender is FooButton button)
{
// Do what you need to do here,using button.Foo as
// your parameter
}
}
我不知道此解决方案的可扩展性。我不是wpf或xaml专家。我敢肯定,使用命令模式可以提供更多的灵活性,并可以控制很多其他事情,但是对于执行此操作的简单,快速的方法,这已经足够了。 :)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。