需求: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已被點擊";
}
}
}