Click here to Skip to main content
15,892,517 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
I'll made an universal Windows 10 application with MVVM. But now I will navigate from ShowWeatherPage to ShowWeatherDetailPage when I click on an item. I will give that item to that new page. The problem is now, when I raise the PropertyChangedEventHandler from the ApplicationViewModel, is this null. How comes that?


Based on this question on Stack Overflow, I have made this code:

IocContainer
public class IocContainer
{
    static IocContainer()
    {
        SimpleIoc.Default.Register<ApplicationViewModel>(false);
        SimpleIoc.Default.Register<ShowWeatherViewModel>(false);
        SimpleIoc.Default.Register<ShowWeatherPage>(false);
        SimpleIoc.Default.Register<ShowWeatherDetailPage>(false);
        SimpleIoc.Default.Register<ShowWeatherDetailViewModel>(false);
    }

    public static IocContainer Ioc
    {
        get { return App.Current.Resources["ioc"] as IocContainer; }
    }

    public ShowWeatherPage ShowWeatherPage
    {
        get { return SimpleIoc.Default.GetInstance<ShowWeatherPage>(); }
    }

    public ShowWeatherViewModel ShowWeatherViewModel
    {
        get { return SimpleIoc.Default.GetInstance<ShowWeatherViewModel>(); }
    }

    public ApplicationViewModel ApplicationViewModel
    {
        get { return SimpleIoc.Default.GetInstance<ApplicationViewModel>(); }
    }

    public ShowWeatherDetailPage ShowWeatherDetailPage
    {
        get { return SimpleIoc.Default.GetInstance<ShowWeatherDetailPage>(); }
    }

    public ShowWeatherDetailViewModel ShowWeatherDetailViewModel
    {
        get { return SimpleIoc.Default.GetInstance<ShowWeatherDetailViewModel>(); }
    }
}


ApplicationViewModel
public class ApplicationViewModel : ViewModelBaseClass
{
    private Page _currentPage = IocContainer.Ioc.ShowWeatherPage;

    public Page CurrentPage
    {
        get
        {
            return _currentPage;
        }
        set
        {
            if (_currentPage != value)
            {
                _currentPage = value;
            }
        }
    }

    public void Navigate(Type sourcePageType)
    {
        if (sourcePageType.Equals(typeof(ShowWeatherDetailPage)))
        {
            IocContainer.Ioc.ShowWeatherDetailViewModel.Item = 
                                  IocContainer.Ioc.ShowWeatherViewModel.SelectedVillage;
            CurrentPage = IocContainer.Ioc.ShowWeatherDetailPage;
        }

        OnPropertyChanged(nameof(CurrentPage));
    }
}


ShowWeatherViewModel
public class ShowWeatherViewModel: ViewModelBaseClass
{
    public Item SelectedVillage
    {
        get
        {
            return _selectedVillage;
        }
        set
        {
            if (_selectedVillage != value)
            {
                _selectedVillage = value;
                ShowDetailPage();
            }
        }
    }

    private void ShowDetailPage()
    {
        ApplicationViewModel appVm = new ApplicationViewModel();
        appVm.Navigate(typeof(ShowWeatherDetailPage));
    }
}


ShowWeatherDetailViewModel
public class ShowWeatherDetailViewModel: ViewModelBaseClass
{
    private Item _item;

    public Item Item
    {
        get { return _item; }
        set { _item = value; }
    }
}


ViewModelBaseClass
public class ViewModelBaseClass: INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
        else
        {
            Debug.WriteLine("PropertyChanged is null");
        }
    }
}


MainPage
<Page
    x:Class="BALaboVoorbeeld.UWP.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:BALaboVoorbeeld.UWP"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    DataContext="{Binding Source={StaticResource ioc}, Path=ApplicationViewModel}"
    mc:Ignorable="d">

    <Grid removed="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Page Content="{Binding CurrentPage, Mode=TwoWay}" />
    </Grid>
</Page>


ShowWeatherPage
<Page
    x:Class="BALaboVoorbeeld.UWP.Pages.ShowWeatherPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:BALaboVoorbeeld.UWP.Pages"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    DataContext="{Binding Source={StaticResource ioc}, Path=ShowWeatherViewModel}"
    mc:Ignorable="d" Width="450">

    <Grid removed="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="100" />
            <ColumnDefinition Width="240" />
            <ColumnDefinition Width="60" />
            <ColumnDefinition Width="1*" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="1" />
            <RowDefinition Height="40" />
            <RowDefinition Height="1*" />
            <RowDefinition Height="40" />
        </Grid.RowDefinitions>
        <TextBlock Text="Village:" 
                   HorizontalAlignment="Right" Margin="4" VerticalAlignment="Center"
                   Grid.Row="1" Grid.Column="0" />
        <TextBox HorizontalAlignment="Stretch" Margin="4" VerticalAlignment="Center"
                 Grid.Row="1" Grid.Column="1" Text="{Binding Village, Mode=TwoWay}" />
        <Button  HorizontalAlignment="Stretch" Margin="4" VerticalAlignment="Center"
                 Grid.Row="1" Grid.Column="2" Command="{Binding ShowWeahter}" >
            <SymbolIcon Symbol="Find" />
        </Button>
        <ListBox Grid.Row="2" Grid.Column="0"  Grid.ColumnSpan="3"
                 ItemContainerStyle="{StaticResource lstidflt}" SelectedItem="{Binding SelectedVillage, Mode=TwoWay}"
                 ItemTemplate="{StaticResource weatheritemdt}" ItemsSource="{Binding VillageList}" />
    </Grid>
</Page>
Posted

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900