1. 程式人生 > >WPF之MVVM模式,通過委託兩個頁面間通訊

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已被點選";
        }
    }
}