Prism WPF Binding RegionManager.RegionName
У меня есть приложение Prism 7 с двумя модулями, называемыми ModuleA и ModuleB. В моем главном окне я хотел бы иметь возможность отображать либо ModuleA, если нажата кнопка «Показать A», либо ModuleB, если нажата кнопка «Показать B». Я реализовал поведение следующим образом:
MainWindow.xaml
<Window x:Class="ModulesTest.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
Title="{Binding Title}" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<ContentControl prism:RegionManager.RegionName="{Binding Module}" />
<StackPanel Grid.Row="1">
<Button Command="{Binding ShowModuleCommand}"
CommandParameter="A">
Show A
</Button>
<Button Command="{Binding ShowModuleCommand}"
CommandParameter="B">
Show B
</Button>
</StackPanel>
</Grid>
MainWindowViewModel.cs
public class MainWindowViewModel : BindableBase
{
private string _title = "Prism Application";
public string Title
{
get { return _title; }
set { SetProperty(ref _title, value); }
}
private string fieldName;
public string Module
{
get { return fieldName; }
set { SetProperty(ref fieldName, value); }
}
private DelegateCommand<string> _showModuleCommand;
public DelegateCommand<string> ShowModuleCommand =>
_showModuleCommand ?? (_showModuleCommand = new DelegateCommand<string>(ExecuteShowModuleCommand));
void ExecuteShowModuleCommand(string module)
{
Module = "Module" + module;
}
public MainWindowViewModel()
{
Module = "ModuleA";
}
}
Проблема в том, что RegionManager.RegionName остается «ModuleA», установленным в конструкторе ViewModel, и не изменяется при нажатии «Show B». Привязка RegionManager.RegionName не разрешена по дизайну или я делаю это неправильно?
Вот также ссылка на репо: https://github.com/moisejbraver/ModulesTest
Ответы
Регион - это структурная часть вашего пользовательского интерфейса. Вы не должны переназначать имя региона после того, как оно было назначено конкретному элементу управления.
Если вам нужно перемещаться по региону, рассмотрите возможность использования IRegionNavigationService...