WPF:我可以从另一个类中的 xaml 文件调用方法吗?

问题描述 投票:0回答:1

我正在开发一个 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 文件中? (如果是的话,我会怎么做)

或者我完全错了,这一切都是以不同的方式完成的?

wpf model-view-controller function-call
1个回答
0
投票

如果您不想实现推荐的 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... 
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.