안녕하세요. 항상 도움을 많이 받고 있습니다
frame을 이용하여 버튼 클릭시 navigation되는 로직을 짜고 있습니다.
초기값을 설정하지 않고 그냥 네비게이션 할때는 괜찮은데 뷰모델에서 프로그램 실행시에 최초로 보여질 화면을 초기값으로 주면
System.NullReferenceException: ‘Object reference not set to an instance of an object.’ 에러를 뱉습니다
Behavior.cs
using Microsoft.Xaml.Behaviors;
using System;
using System.Windows;
using System.Windows.Controls;
public class FrameBehavior : Behavior<Frame>
{
private bool _isWork;
protected override void OnAttached()
{
AssociatedObject.Navigating += AssociatedObject_Navigating;
AssociatedObject.Navigated += AssociatedObject_Navigated;
}
private void AssociatedObject_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e)
{
_isWork = true;
NavigationSource = e.Uri.ToString();
_isWork = false;
if (AssociatedObject.Content is Page pageContent
&& pageContent.DataContext is INavigationAware navigationAware)
{
navigationAware.OnNavigated(sender, e);
}
}
private void AssociatedObject_Navigating(object sender, System.Windows.Navigation.NavigatingCancelEventArgs e)
{
//네비게이션 시작전 상황을 뷰모델에 알려주기
if (AssociatedObject.Content is Page pageContent
&& pageContent.DataContext is INavigationAware navigationAware)
{
navigationAware?.OnNavigating(sender, e);
}
}
protected override void OnDetaching()
{
AssociatedObject.Navigating -= AssociatedObject_Navigating;
AssociatedObject.Navigated -= AssociatedObject_Navigated;
}
public string NavigationSource
{
get { return (string)GetValue(NavigationSourceProperty); }
set { SetValue(NavigationSourceProperty, value); }
}
/// <summary>
/// NavigationSource DP
/// </summary>
public static readonly DependencyProperty NavigationSourceProperty =
DependencyProperty.Register(nameof(NavigationSource), typeof(string), typeof(FrameBehavior), new PropertyMetadata(null, NavigationSourceChanged));
private static void NavigationSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var behavior = (FrameBehavior)d;
if (behavior._isWork)
{
return;
}
behavior.Navigate();
}
/// <summary>
/// 네비게이트
/// </summary>
private void Navigate()
{
switch (NavigationSource)
{
default:
//navigate
AssociatedObject.Navigate(new Uri(NavigationSource, UriKind.RelativeOrAbsolute));
break;
}
}
}
}
MainWindowViewModel
private void init()
{
NavigationSource = "View/Dashboard.xaml"; //실행되자마자 로드되어야할 뷰
NavigateCommand = new RelayCommand<string>(OnNavigate);
}
private void OnNavigate(string pageUri)
{
NavigationSource = pageUri;
}
private string _navaigationSource;
public string NavigationSource
{
get => _navaigationSource;
set => SetProperty(ref _navaigationSource, value);
}
public ICommand NavigateCommand { get; set; }
public MainWindowViewModel()
{
init();
}
``초기값을 주지않고 그냥 navigation할때```