WPF窗體MainWindow中有 Frame控件,名為 MainFrame,
MainFrame 通過ViewModel綁定Source屬性來設置顯示的Page頁,
其中的Page頁需要與MainWindow 共用一個ViewModel對象做DataContext
MainWindow.xaml
<Border Margin="5" Background="White" CornerRadius="4" Padding="6" Grid.Row="1">
<Frame Margin="0" x:Name="MainFrame" NavigationUIVisibility="Hidden" LoadCompleted="MainFrame_LoadCompleted" Source="{Binding PageUri,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}" />
</Border>
MainWindow.xaml.cs
public MainWindow()
{
InitializeComponent();
_viewModel = new ViewModel();
this.DataContext = _viewModel;
}
private void MainFrame_LoadCompleted(object sender, NavigationEventArgs e)
{
var content = MainFrame.Content as FrameworkElement;//獲取當前Frame中的Page
if (content == null)
{
return;
}
content.DataContext = this.DataContext;//設置Page的DataContext
}
ViewModel.cs
private Uri pageUri;
//當前Frame顯示的PageUri,即Source屬性值,通過設置此屬性值來管理Frame的顯示
public Uri PageUri {
get
{
if (pageUri==null)
{
pageUri = new Uri("Pages/Page1.xaml",UriKind.Relative);
}
return pageUri;
}
set
{
pageUri = value;
OnPropertyChanged(nameof(PageUri));
}
}
ViewModelBase.cs
public class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}