我正在开发一个 WPF 项目,我为我的应用程序实现了 MVC 模式。 因此,我将 MainWindow.xaml 和 MainWindow.xaml.cs 作为视图,然后是控制器和模型类(我第一次这样做)。 到目前为止一切都很好。但这是我不喜欢的: 当我在 xaml 文件中定义了一个事件时,让我们看一下:
<Button Content="Save" Click="SaveButton_ClickEvent"/>
然后每当单击“保存”按钮时,就会调用 xaml.cs 文件中的函数:
private void SaveButton_ClickEvent(object sender, RoutedEventArgs e)
{
Controller.Save();
}
实际上,我在 xaml.cs 文件中有很多这样的函数,其中有一个函数只调用控制器中的另一个函数,这对我来说似乎有点浪费。难道没有更好的方法吗? 我想我在某处读到过,如果在 WPF 中实现 MVC 模式,则 xaml.cs 文件几乎保持为空。 所以我的问题是:
有没有办法从 .xaml 文件中调用我的控制器(或任何其他)类中的方法,而不将函数放入 xaml.cs 文件中? (如果是的话,我会怎么做)
或者我完全错了,这一切都是以不同的方式完成的?
如果您不想实现推荐的 MVVM 设计模式并用将
Command
的 Button
属性绑定到视图模型的 ICommand
属性的绑定替换事件处理程序,您可以例如实现处理 Click
事件并调用控制器的附加行为:
public static class Mvc
{
public static readonly DependencyProperty ClickProperty =
DependencyProperty.RegisterAttached(
"Click", typeof(string), typeof(Mvc),
new PropertyMetadata(string.Empty, OnChanged));
public static string GetClick(Button obj) =>
(string)obj.GetValue(ClickProperty);
public static void SetClick(Button obj, string value) =>
obj.SetValue(ClickProperty, value);
private static void OnChanged(
DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
if (!string.IsNullOrEmpty(e.NewValue as string)
&& obj is Button button)
{
button.Click += OnButtonClick;
}
}
private static void OnButtonClick(object sender, RoutedEventArgs e)
{
Button button = (Button)sender;
object controller = button.DataContext;
if (controller != null)
{
string methodName = GetClick(button);
if (!string.IsNullOrEmpty(methodName))
{
controller.GetType()
.GetMethod(methodName)?
.Invoke(controller, null);
}
}
}
}
XAML:
<Button Content="Save" local:Mvc.Click="Save"/>
隐藏代码:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new Controller();
}
}
控制器:
public class Controller
{
public void Save()
{
//save...
}
}