CODEKILLER

반응형

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)
{
}
반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band