WPF之MVVM模式,通過委託兩個頁面間通信

需求:MVVM模式,在MainWindow的ViewModel接收到UserCOntrolB的Command事件

Command .cs

using System;
using System.Windows.Input;

namespace WpfApplication
{
    public class Command : ICommand
    {
        Action<object> executeMethod;
        Func<object, bool> canExecuteMethod;
        public Command(Action<object> execute):this(execute,null)
        {

        }
        public Command(Action<object> execute, Func<object, bool> canExecute)
        {
            executeMethod = execute;
            canExecuteMethod = canExecute;
        }
        public event EventHandler CanExecuteChanged;

        public bool CanExecute(object parameter)
        {
            return canExecuteMethod(parameter);
        }

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

UserControlB.xaml

<UserControl x:Class="WpfApplication.UserControlB"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:WpfApplication"
             mc:Ignorable="d" 
             d:DesignHeight="100" d:DesignWidth="300">
    <Grid>
        <Button x:Name="btnUserControl" Command="{Binding ButtonClickCommand}" CommandParameter="{Binding ElementName=btnUserControl}" Content="UserControlB" Background="Yellow"></Button>
    </Grid>
</UserControl>

UserControlB.xaml.cs

using System.Windows.Controls;
namespace WpfApplication
{
    /// <summary>
    /// UserControl.xaml 的交互邏輯
    /// </summary>
    public partial class UserControlB : UserControl
    {
        public UserControlB()
        {
            InitializeComponent();
            DataContext = new UserControlBViewModel(null);
        }
    }
}

UserControlBViewModel.cs

using System;

namespace WpfApplication
{
    public class UserControlBViewModel
    {
        public Command ButtonClickCommand { get; set; }
        public UserControlBViewModel(Action<object> executeMethod)
        {
            ButtonClickCommand = new Command(executeMethod, p=> { return true; });
        }
        private void executeMethod(object obj)
        {
            //目前沒有解決,如何得到executeMethod方法,望大神指教~~~
        }
    }
}

MainWindow.xaml

<Window x:Class="WpfApplication.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:WpfApplication"
        xmlns:usercontrol="clr-namespace:WpfApplication"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Grid Grid.Row="0">
            <Button x:Name="MyButton" Content="MainWindow" Background="AliceBlue" ></Button>
        </Grid>
        <Grid Grid.Row="1">
            <usercontrol:UserControlB DataContext="{Binding UserControlBViewModelObj}"></usercontrol:UserControlB>
        </Grid>
    </Grid>
</Window>

MainWindow.xaml.cs

namespace WpfApplication
{
    /// <summary>
    /// MainWindow.xaml 的交互邏輯
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = new MainWindowViewModel();
        }
    }
}

MainWindowViewModel.cs

using System.Windows.Controls;

namespace WpfApplication
{
    public class MainWindowViewModel
    {
        private UserControlBViewModel _userControlBViewModelObj;
        public UserControlBViewModel UserControlBViewModelObj
        {
            get { return _userControlBViewModelObj; }
            set { _userControlBViewModelObj = value; }
        }

        public MainWindowViewModel()
        {
            UserControlBViewModelObj = new UserControlBViewModel(ExecuteUserControlBViewModelObj);
        }

        private void ExecuteUserControlBViewModelObj(object obj)
        {
            Button button = obj as Button;
            button.Content = "UserControl已被點擊";
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章