.net Maui Page 분할 및 WeakReferenceMessenger 질문

안녕하세요. .net Maui 첫 프로젝트이자 .Net Dev 첫 질문올립니다.

  • 무엇을 하고자 하는지
    MainPage에서 작업메시지를 보내면 실시간으로 다른Page에서 해당 데이터를 받아서 작업을 진행하고 싶습니다.
  • 질문
  1. .net maui에서 아래 wpf코드처럼 처리가 가능할까요 ?
<UserControl>   
.. 생략
<Button Command= 바인딩> // TaskView로 메시지전송
<recviews:TaskView Grid.Row="0" />   // 메시지구독하고 해당 데이터로 작업시작
</UserControl>
  1. 1번 항목이 안되는거 같아서 FlyoutItem을 통해 Page를 나누고 WeakReferenceMessenger으로 실시간으로 메시지를 주고받을려고 했으나 각 페이지로드가 되어야 메시지구독이 가능하니까 문제가 있더라구요.
    페이지가 로드되기전에 메시지를 구독하거나, 아예 다른방법이 있을까요 ?

답변 부탁드립니다. 감사합니다.

1 Like

Maui에서 UserControl 대신 ContentView를 사용하시면 됩니다.

<ContentView>
  .. 생략
  <Button Command= 바인딩> // TaskView로 메시지전송
  <recviews:TaskView Grid.Row="0" />   // 메시지구독하고 해당 데이터로 작업시작
</ContentView>

구독하고자 하는 ViewModel을 미리 Builder.Service.Add(xxViewModel) 등록 후
아래 와 같이 구현해주면 페이지 로드 되기 이전에 뷰모델은 메신저 통신이 가능하실겁니다.

public class MainViewModel: ObservableObject
{
   public MainViewModel(xxViewModel vm)
   {
     
   }
}

2 Likes

친절한 답변 너무 감사합니다! 너무 큰 도움이 됐습니다.

혹시 하나만 더 여쭤봐도 될까요 ?

<view:MetadataView x:Name="metadataView"/> // MedataView는 ContentView

위와 같이 뷰를 넣고, MetadataView에 MetadatViewmodel을 바인딩하고자 합니다.
바인딩하는 방법은 찾아보니 아래와 같은 2가지 방법이 있는거같은데요.

일단 VIewModel에는 아래와 같이 구성되어있습니다.

//      builder.Services.AddSingleton<ILogService, LogService>();

        public MetadataViewModel(ILogService logService)
        {
            _logger = logService; // 로그를 찍기 위함
        }

아래는 바인딩 2가지 방법 처리한 결과입니다.

**(MetadataView.xaml)**

    <ContentView.BindingContext>
        <vm:MetadataViewModel/>
    </ContentView.BindingContext>

위 방법을 사용하면 ViewModel 생성자에 파라미터가 있기때문에 에러가 나고..

**(MetadataView.xaml.cs)**

    public MetadataView(MetadataViewModel vm)
	{
		InitializeComponent();
        BindingContext = vm;        
    }	

위 방법을 사용하면 MainView에서 아래와 같이하게되면 MedataView 생성자에 viewmodel 파라미터가 들어가있어서 에러가 나네요 ..
<view:MetadataView x:Name="metadataView"/>

Maui에 대한 지식이 거의 전무하여 하나하면 하나막히고, 진행이 안되네요 ㅠㅠ
답변 부탁드립니다. 감사합니다.

1 Like

페이지 안에 다수의 컨텐츠뷰를 넣고 각각의 뷰모델을 꽂는다면
솔직히 막막한 구조이긴 합니다.

현재 구조상으로 따졌을때에는
아래 예제를 활용해보시면 좋을것 같습니다 :slight_smile:

#if WINDOWS
MauiWinUIApplication.Current.Services.GetService<MetadataViewModel >();
#elif ANDROID
MauiApplication.Current.Services.GetService<MetadataViewModel >();
#elif IOS
MauiUIApplication.Current.Services.GetService<MetadataViewModel >();
#endif

예시)

**(MetadataView.xaml.cs)**

    public MetadataView()
	{
		InitializeComponent();
#if WINDOWS
        BindingContext  = MauiWinUIApplication.Current.Services.GetService<MetadataViewModel >();
#elif ANDROID
        BindingContext  = MauiApplication.Current.Services.GetService<MetadataViewModel >();
#elif IOS
        BindingContext  = MauiUIApplication.Current.Services.GetService<MetadataViewModel >();
#endif  
    }	
1 Like

저도 방금 해법을 찾아서 자문자답을 할려고했는데 바로 답변 주셨네요
너무 감사합니다!

지금 하고 작업이 단일화면에 여러가지 작업을 처리해야되서요. 그렇다고 MainPage에 모든 코드를 넣자니 정리도 안되더라구요. ( 아직 초보라서 코드를 깔끔하게 짜는걸 잘 못합니다ㅠ)

답변 다시 한번 감사드립니다.! :smiley:

1 Like