Задавал вопрос с сообществе Prism. Brian Lagunas уверяет, что это не проблема Prism.
Суть Wpf 4.5 + Prism 6.3:
CustomersView с DataGrid и реализованным фильтром в ColumnHeader:
<DataGrid.ColumnHeaderStyle>
<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
<Grid x:Name="gridColumnHeader">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<ContentPresenter x:Name="contentPresenterColumnHeader"/>
<TextBox x:Name="filter" Grid.Row="1" Height="30" Width="30"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</DataGrid.ColumnHeaderStyle>
Пользователь устанавливает фильтр в столбце Name(filter.Text = 11) и совершает навигацию для редактирования выбранного Customer в EditCustomerView. После редактирования IRegionNavigationJournal.GoBack() возвращаемся в CustomersView. Все изменения прошли, но в заголовке потерся фильтр в дефолтное значение(filter.Text = string.Empty). Перерисовывается ColumnHeaderStyle? Для эксперимента положил на CustomersView TextBox, навигация не трет TextBox.Text.
MCVE
CustomersViewModel
public class CustomersViewModel : BindableBase, INavigationAware
{
private readonly IRegionManager _regionManager;
public CustomersViewModel(IRegionManager regionManager)
{
_regionManager = regionManager;
Customers = new ObservableCollection<Customer>();
Customers.Add(new Customer { Id = 1, Name = "Samsung", Type = 1 });
Customers.Add(new Customer { Id = 2, Name = "Apple", Type = 1 });
}
private ObservableCollection<Customer> _customers;
public ObservableCollection<Customer> Customers
{
get { return _customers; }
set
{
SetProperty(ref _customers, value);
}
}
public ICommand AddCustomerCommand { get { return new DelegateCommand<object>(ExecuteAddCustomer); } }
private void ExecuteAddCustomer(object parameter)
{
_regionManager.RequestNavigate("ContentRegion", new Uri("CustomerView", UriKind.Relative));
}
public virtual bool IsNavigationTarget(NavigationContext navigationContext)
{
return true;
}
public virtual void OnNavigatedFrom(NavigationContext navigationContext)
{
}
public virtual void OnNavigatedTo(NavigationContext navigationContext)
{
}
}
CustomerViewModel
public class CustomerViewModel : BindableBase, INavigationAware
{
private readonly IRegionManager _regionManager;
private IRegionNavigationJournal _navigationJournal;
public CustomerViewModel(IRegionManager regionManager)
{
_regionManager = regionManager;
}
public ICommand SaveCommand { get { return new DelegateCommand<object>(ExecuteSaveCommand); } }
private void ExecuteSaveCommand(object parameter)
{
if (_navigationJournal.CanGoBack)
{
_navigationJournal.GoBack();
}
}
public virtual bool IsNavigationTarget(NavigationContext navigationContext)
{
return false;
}
public virtual void OnNavigatedFrom(NavigationContext navigationContext)
{
}
public virtual void OnNavigatedTo(NavigationContext navigationContext)
{
_navigationJournal = navigationContext.NavigationService.Journal;
}
}
CustomersView до навигации с установленным фильтром в Column.Name = 11:
CustomersView после навигации с удаленным фильтром:
Пример кода - PrismNavigation
Спасибо.
Продвижение своими сайтами как стратегия роста и независимости