.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개의 좋아요

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개의 좋아요

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

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

<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개의 좋아요

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

현재 구조상으로 따졌을때에는
아래 예제를 활용해보시면 좋을것 같습니다 :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개의 좋아요

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

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

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

1개의 좋아요