我实际上使用6个不同的按钮来做同一件事。
private void VisaCreaDoc_Click(object sender, RoutedEventArgs e)
{
ViewModel.ValidateItem(InfosPosteViewModel.CREADOC);
}
private void VisaTravaux_Click(object sender, RoutedEventArgs e)
{
ViewModel.ValidateItem(InfosPosteViewModel.TRAVAUX);
}
private void VisaRemiseOuvrageIR_Click(object sender, RoutedEventArgs e)
{
ViewModel.ValidateItem(InfosPosteViewModel.REMISEOUVRIR);
}
private void VisaRemiseOuvrageExpl_Click(object sender, RoutedEventArgs e)
{
ViewModel.ValidateItem(InfosPosteViewModel.REMISEOUVREXPL);
}
private void VisaMES_Click(object sender, RoutedEventArgs e)
{
ViewModel.ValidateItem(InfosPosteViewModel.MISEENSERVICE);
}
private void VisaEncodageArchivage_Click(object sender, RoutedEventArgs e)
{
ViewModel.ValidateItem(InfosPosteViewModel.ENCODAGEARCHIVAGE);
如您所见,他们正在使用ViewModel
中带有不同参数的函数。
是否有任何方法可以将6个按钮事件重新组合为仅一个类型,并且可以直接在XAML调用中传递参数,或者类似的方法来避免“代码重复”?
答案 0 :(得分:2)
不确定您是否喜欢“更好”,但是可以检查在处理程序中单击了哪个按钮:
void HandleButton_Click(object sender, RoutetEventArgs e)
{
if (sender is Button b)
{
if (b == VisaCreaDoc) # VisaCreaDoc is the given name of your button instace in xaml
ViewModel.ValidateItem(InfosPosteViewModel.CREADOC);
else if (b == VisaTravaux)
ViewModel.ValidateItem(InfosPosteViewModel.TRAVAUX);
else if (...) // etc.
}
}
您可以使用switch pattern matching为它增添趣味,以摆脱if / else if / else if / ...
链条。
答案 1 :(得分:0)
也许可以通过为ViewModel函数创建命令来避免重复代码(请参见Introduction to WPF Commands)。据我所知,您还可以在XAML中定义一个CommandParameter
。