안녕하세요. .net Maui 첫 프로젝트이자 .Net Dev 첫 질문올립니다.
무엇을 하고자 하는지
MainPage에서 작업메시지를 보내면 실시간으로 다른Page에서 해당 데이터를 받아서 작업을 진행하고 싶습니다.
질문
.net maui에서 아래 wpf코드처럼 처리가 가능할까요 ?
<UserControl>
.. 생략
<Button Command= 바인딩> // TaskView로 메시지전송
<recviews:TaskView Grid.Row="0" /> // 메시지구독하고 해당 데이터로 작업시작
</UserControl>
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개의 좋아요
이광석
1월 10, 2024, 5:42오전
4
페이지 안에 다수의 컨텐츠뷰를 넣고 각각의 뷰모델을 꽂는다면
솔직히 막막한 구조이긴 합니다.
현재 구조상으로 따졌을때에는
아래 예제를 활용해보시면 좋을것 같습니다
#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에 모든 코드를 넣자니 정리도 안되더라구요. ( 아직 초보라서 코드를 깔끔하게 짜는걸 잘 못합니다ㅠ)
답변 다시 한번 감사드립니다.!
1개의 좋아요