[MAUI] Navigate.Page를 열 때 Paramater 값을 넘겨주는 방법이 궁금합니다.

Navigate.Page를 열 때 Paramater 값을 넘겨주는 방법이 궁금합니다.

  • PageParamater 값에 따라 UI가 랜더링 된다.
    Binding된 값에 따라 타이틀 이름과 보여줄 이미지가 결정되는 구조입니다.
    즉 하나의 페이지에서 Parameter 값에 따라 보여지는 것들??이 다릅니다.
  • 페이지가 랜더링 되기 전에 Parameter 값으로 셋팅되어야 하는 구조입니다.

설명?

MAUI 마이그레이션 진행 중이며 Xamarin에서는 다음과 같이 동작합니다.

// Page 열기 및 Parameter 값 넘겨주기
PageParameter parameter = new PageParameter(title, TitleKey); // parameter 생성
return NavigateAsync<PageViewModel, PageParameter>(parameter); // parameter 전달 및 Page 열기

// Page 초기화 되는 곳??
MvxViewModel - Prepare 
// Prepare를 통해 UI가 구성 되기전?에 parameter 값으로 초기화 합니다

MvvmCross 기능으로 Parameter 값을 넘겨주고 Prepare 이벤트?로 Page의 속성을 초기화 한다음에 페이지를 여는 구조 였습니다.

MAUI로 넘어오면서 MvvmCross 사용이 불가능하여 다음과 같은 기능을 사용해 보았습니다.

MAUI 기본 기능 Pass data 링크 :point_down:

// MAUI 기본 기능 `pass data` 예제
var navigationParameter = new Dictionary<string, object>
    {
        { "Bear", animal }
    };
await Shell.Current.GoToAsync($"beardetails", navigationParameter);

URI 베이스로 Parameter 값이 정상적으로 넘어가긴 합니다.
UI 랜더링이 끝나고 나서(Page가 열리고 나서) Parameter 값이 들어오기 때문에 문제가 생깁니다.
이미 UI에 대한 판별이 끝나서 Parameter 값이 없다는 페이지가 생성됩니다.
( 마치 DataSelector??처럼 Paramter 값이 있는 것과 없을 때 생성 되는 페이지가 다릅니다…)

결론?? 원하는 동작

  • Page에 Data를 전달해야한다.

  • Page가 랜더링 되기전에 Data값으로 속성들을 초기화 해줘야한다.

  • 또는 ViewModel의 속성을 미리 초기화해서 페이지를 여는 방법…
    이 방법 같은 경우에는 예제와 같이 ViewModel에서 페이지를 여는 코드가 들어가며 Page에 대한 참조를 없애기 위해 Key 값,
    그러니까 String 데이터를 주면 등록된 Route를 통해 페이지가 열리는 방식이라 ;;;
    속성이 초기화 된 ViewModel을 Page를 줄 수 있는지 모르겠네요;;
    정리하자면 MVVM 패턴을 준수하면서 미리 초기화해서 보내는 방법을 모르겠습니다.

1개의 좋아요

안녕하세요
TinyMvvm 소스 확인 하셔서
직접 구현이나 사용하시면 좋을 것 같습니다

3개의 좋아요

복잡한 문제일 수록 단순하게^^

static class DataBag
{
    private static Dictionary<string, object> _store = new();

    public static void AddOrUpdate(string key, object value)
    {
        _store[key] = value;
    }

    public static object Get(string key, bool reuse = false)
    {
        if(_store.TryGetValue(key, out object value))
        {
            if(reuse is false)
                _store.Remove(key);

            return value;
        }

        return null;
    }
}

==33

3개의 좋아요