Xaml의 페이지 내에 컨트롤의 개수가 많아 Command를 무척 많이 추가해야 할 경우,
ViewModel 페이지에 Command로 지져분해질 수 있습니다.
이럴 경우, ViewModel에서는 하나의 Command만 생성하고, Param을 구분해서 사용하면 편하게 사용가능합니다.
▶StringToCommand Class
public static class StringToCommand
{
/// <summary>
/// dataContext를 command로 보내기
/// </summary>
public static void Execute(object dataContext, string command)
{
StringToCommand.Execute<object>(dataContext, command, null);
}
/// <summary>
/// dataContext를 command로 보내면서 특정 Parameter 보내기
/// </summary>
/// <typeparam name="T">전송할 파라미터</typeparam>
public static void Execute<T>(object dataContext, string command, T parameter)
{
if (dataContext == null)
return;
if (string.IsNullOrWhiteSpace(command) == true)
return;
PropertyInfo pi = dataContext.GetType().GetProperty(command);
if (pi == null)
return;
if (!(pi.GetValue(dataContext, null) is ICommand ic))
return;
// ICommand 형의 매칭된 Command를 이용하여 Parameter
ic.Execute(parameter);
}
}
/// <summary>
/// command로 보내질 파라미터 형식 클래스
/// </summary>
public class ToParameters<T>
{
public T Param { get; set; }
public ToParameters(T param)
{
this.Param = param;
}
}
▶ behind 코드 (예제는 string을 전달합니다.)
// Xaml의 behind코드 등에서 이벤트 내에 아래의 구문 사용.
StringToCommand.Execute<string>(this.DataContext, "SpecialCommand", null);
▶viewmodel 코드 (예제는 string을 전달합니다.)
// string을 param형식으로 가지는 command 선언
private DelegateCommand<string> specialCommand;
// param이 전달되는 DelegateCommand
public ICommand SpecialCommand
{
get
{
if (this.specialCommand == null)
{
this.specialCommand = new DelegateCommand<string>((p) => this.OnSpecialCommand(p));
}
return this.specialCommand;
}
}
/// <summary>
/// specialCommand Handler.
/// </summary>
private void OnSpecialCommand(object o)
{
}