WPF中的命令模式:打造清晰、可重用的程式碼利器

架构师老卢發表於2024-03-11
WPF中的命令模式:打造清晰、可重用的程式碼利器

概述:在WPF中,Command是一種優秀的機制,透過它,我們能夠將使用者介面操作與業務邏輯分離,提高程式碼的可維護性和可重用性。透過自定義ICommand介面的實現(如RelayCommand),我們能夠輕鬆建立並在XAML中繫結命令,實現清晰的MVVM架構。這種模式使得應用程式的開發更加靈活,同時提高了程式碼的可測試性。

在WPF(Windows Presentation Foundation)中,Command(命令)是一種用於處理使用者介面元素互動的機制,它有助於將使用者輸入(如按鈕點選、選單選擇等)與應用程式邏輯分離開來。使用命令模式,可以在MVVM(Model-View-ViewModel)架構中更好地組織程式碼,並且有助於實現可重用和可測試的程式碼。以下是關於WPF中Command的詳細講解:

1. Command的作用和功能:

在WPF中,Command主要有以下幾個作用和功能:

  • 解耦UI和業務邏輯: 使用Command可以將使用者介面元素(如按鈕)的操作與實際的業務邏輯分離,使程式碼更易維護和測試。
  • 可重用性: 可以在多個介面元素中共享相同的命令,從而提高程式碼的可重用性。
  • 支援非同步操作: Command可以處理非同步操作,例如在後臺執行緒中執行某些任務而不阻塞使用者介面。
  • 狀態管理: 命令可以透過CanExecute方法控制是否允許執行,從而實現對命令的狀態管理。

2. Command的用法:

在WPF中,可以使用ICommand介面來定義自定義命令,也可以使用RoutedCommandRoutedUICommand類來建立路由命令。以下是使用ICommand介面的示例:

using System;
using System.Windows.Input;

public class RelayCommand : ICommand
{
    private readonly Action<object> _execute;
    private readonly Func<object, bool> _canExecute;

    public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null)
    {
        _execute = execute ?? throw new ArgumentNullException(nameof(execute));
        _canExecute = canExecute;
    }

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    public bool CanExecute(object parameter)
    {
        return _canExecute == null || _canExecute(parameter);
    }

    public void Execute(object parameter)
    {
        _execute(parameter);
    }
}

3. 使用Command的步驟:

步驟如下:

步驟 1:建立ViewModel並定義命令

using System.Diagnostics;
using System.Windows.Input;

namespace Sample_WPFCommand
{
    public class MainViewModel
    {
        public ICommand MyCommand { get; }

        public MainViewModel()
        {
            MyCommand = new RelayCommand(ExecuteMyCommand, CanExecuteMyCommand);
        }

        private void ExecuteMyCommand(object parameter)
        {
            Trace.WriteLine($"{DateTime.Now.ToString()}點選了我,我該幹什麼我不記得了:(");
            // 處理命令執行邏輯
        }

        private bool CanExecuteMyCommand(object parameter)
        {
            // 定義命令是否可執行的邏輯
            return true;
        }
    }

}

步驟 2:在XAML中繫結命令

<Window x:Class="Sample_WPFCommand.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Sample_WPFCommand"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">

    <Window.DataContext>
        <local:MainViewModel />
    </Window.DataContext>

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>

        <Button Grid.Row="0" Content="點我試試,哈哈" Command="{Binding MyCommand}" HorizontalAlignment="Center" VerticalAlignment="Center" />
    </Grid>
</Window>

執行效果:

WPF中的命令模式:打造清晰、可重用的程式碼利器

4. 例項原始碼:

上述步驟中的原始碼已經涵蓋了一個簡單的WPF應用程式中如何使用Command。請根據實際需求修改ExecuteMyCommandCanExecuteMyCommand方法中的邏輯。

連結:https://pan.baidu.com/s/1BgF2CnS6q6zDkEi7Yw6pfw?pwd=6666

相關文章