Приведение исключения в NavigationService

У меня есть две страницы (MainWindow и Client), и я пытаюсь использовать NavigationService для навигации между своими страницами.

Когда я перехожу от MainWindow к клиенту, он работает, но когда я пытаюсь перейти от клиента к MainWindow, это дает мне исключение:

Невозможно преобразовать объект типа WpfApplication1.MainWindow в WpfApplication1.Client

Это мое главное окно

<Grid>
    <Button HorizontalAlignment="Center"
            VerticalAlignment="Center"
            Click="Navigate_Click">Navigate</Button>
</Grid>

private void Navigate_Click(object sender, RoutedEventArgs e)
{
    if (NavigationService == null)
    {
        return;
    }

    NavigationService.Navigate(new Uri("Client.xaml", UriKind.Relative), "Hi from calling window!");
    NavigationService.LoadCompleted += NavigationService_LoadCompleted;
}

private void NavigationService_LoadCompleted(object sender, NavigationEventArgs e)
{
    ((Client)e.Content).MessageFromCallingWindow = (string)e.ExtraData;
}

И клиент

<Grid>
    <StackPanel>
        <TextBlock VerticalAlignment="Center"
                   HorizontalAlignment="Center"
                   Text="{Binding MessageFromCallingWindow}" />

        <Button Click="OnClick">Go back</Button>
    </StackPanel>
</Grid>

public static DependencyProperty MessageFromCallingWindowProperty = DependencyProperty.Register("MessageFromCallingWindow", typeof(string), typeof(Client));

public string MessageFromCallingWindow
{
    get { return (string)GetValue(MessageFromCallingWindowProperty); }
    set { SetValue(MessageFromCallingWindowProperty, value); }
}

private void OnClick(object sender, RoutedEventArgs e)
{
    if (NavigationService != null)
    {
        NavigationService.Navigate(new Uri("MainWindow.xaml", UriKind.Relative), "returning hello from client");
    }
}

Я также пробовал NaviugationService.GoBack(), но это дает то же исключение!

Любая подсказка?


person Wassim AZIRAR    schedule 02.12.2013    source источник


Ответы (1)


Каждый раз, когда ваша навигация завершается, вы вызываете этот код:

((Client)e.Content).MessageFromCallingWindow = (string)e.ExtraData;

Проще говоря, этот код не будет работать, когда вы перейдете к MainWindow, потому что вы не можете привести его к Client.

person Dan Puzey    schedule 02.12.2013
comment
И что я должен сделать, чтобы вернуться и отправить сообщение MainWindow, как это было сделано для клиента? - person Wassim AZIRAR; 02.12.2013
comment
Здесь есть вопрос , в котором обсуждаются некоторые из лучшие методы для связи между страницами в WPF. - person Dan Puzey; 02.12.2013
comment
Это не то, о чем я спрашивал, сэр! - person Wassim AZIRAR; 02.12.2013
comment
Нет, но это лучший ответ на вашу проблему. Альтернативы: реализация вашего свойства MessageFromCallingWindow в базовом классе и получение всех ваших страниц от него (означает, что вы приводите e.Content к BaseClass вместо Client), или вы определяете тип страницы и выполняете соответствующее преобразование (например: if (e.Content is Client) { // do your existing cast } else if (e.Content is MainWindow) { // do a different cast } и т. д.). .. Это не рекомендуемый подход! - person Dan Puzey; 02.12.2013