0

App.cs {

#if DEBUG
            if (System.Diagnostics.Debugger.IsAttached)
            {
                this.DebugSettings.EnableFrameRateCounter = true;
            }
#endif

            Frame rootFrame = Window.Current.Content as Frame;

            // Do not repeat app initialization when the Window already has content,
            // just ensure that the window is active
            if (rootFrame == null)
            {
                // Create a Frame to act as the navigation context and navigate to the first page

                rootFrame = new Frame();
                var viewModel = new MainWindowModel();
                MainPage main = new MainPage();
                main.DataContext = viewModel;

                // TODO: change this value to a cache size that is appropriate for your application
                rootFrame.CacheSize = 1;

                if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
                {
                    // TODO: Load state from previously suspended application
                }

                // Place the frame in the current Window
                Window.Current.Content = rootFrame;
            }

DataAccess.cs

{
        readonly List<Menu> _menu;

        public MenuRespository()
        {
            if(_menu==null)
            {
                _menu = new List<Menu>();
            }
            _menu.Add(Menu.CreateMenu("/Photos/Gas-50.png", "t"));
            _menu.Add(Menu.CreateMenu("/Photos/Gas-50.png", "t"));
            _menu.Add(Menu.CreateMenu("/Photos/Gas-50.png", "t"));
            _menu.Add(Menu.CreateMenu("/Photos/Gas-50.png", "t"));
            _menu.Add(Menu.CreateMenu("/Photos/Gas-50.png", "t"));
            _menu.Add(Menu.CreateMenu("/Photos/Gas-50.png", "t"));
            _menu.Add(Menu.CreateMenu("/Photos/Gas-50.png", "t"));
        }
        public List<Menu> GetMenu()
        {
            return new List<Menu>(_menu);
        }
    }

Menu.cs

public class Menu
    {
        public static Menu CreateMenu(string iconthumb, string text)
        {
            return new Menu { IconThumb = iconthumb, Text = text };
        }
        public string IconThumb { get; set; }
        public string Text { get; set; }
    }

MainWindowsModel
 public class MainWindowModel :ViewModelBase
    {
        readonly MenuRespository _menuRepository;
        ObservableCollection<ViewModelBase> _viewModels;
        public MainWindowModel()
        {
            _menuRepository = new MenuRespository();
            //create an instance of our viewmodel add it to our collection
            MenuListViewModel viewModel = new MenuListViewModel(_menuRepository);
            this.ViewModels.Add(viewModel);
        }
        public ObservableCollection<ViewModelBase> ViewModels
        {
            get
            {
                if(_viewModels==null)
                {
                    _viewModels = new ObservableCollection<ViewModelBase>();

                }
                return _viewModels;
            }
        }
    }

ViewBase

 public abstract class ViewModelBase :INotifyPropertyChanged, IDisposable
    {
        protected ViewModelBase()
        {

        }
        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler hander = this.PropertyChanged;
            if(hander!=null)
            {
                var e = new PropertyChangedEventArgs(propertyName);
                hander(this, e);
            }
        }

        public void Dispose()
        {
            this.Dispose();
        }

        protected virtual void OnDispose()
        {

        }
    }

 class MenuListViewModel :ViewModelBase
    {
        readonly MenuRespository _menuRepository;
        public ObservableCollection<Model.Menu> AllMenu
        {
            get;
            private set;
        }

        public MenuListViewModel(MenuRespository menuRepository)
        {
            if(menuRepository==null)
            {
                throw new ArgumentException("menuRepository");
            }
            _menuRepository = menuRepository;
            this.AllMenu = new ObservableCollection<Model.Menu>(_menuRepository.GetMenu());
        }

        protected override void OnDispose()
        {
            //base.OnDispose();
            this.AllMenu.Clear();
        }
    }

MenuListBox.xaml into View(show off "Severity Code Description Project File Line Error CS0263 Partial declarations of 'MenuListBox' must not specify different base classes

MixNokia.Windows

"

<UserControl
    x:Class="MixNokia.View.MenuListBox"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:MixNokia.View"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <StackPanel>
        <ListBox ItemsSource="{Binding AllMenu}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <Image Source="{Binding IconThumb}"  Width="40" Height="40" VerticalAlignment="Center" HorizontalAlignment="Left"></Image>
                        <TextBlock Text="{Binding Text}" FontSize="15" Foreground="#CCCCCC" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </StackPanel>
</UserControl>

The final

<Page
    x:Class="MixNokia.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:MixNokia"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:vm="clr-namespace:MixNokia.ViewModel"
    xmlns:v="clr-namespace:MixNokia.View"
    mc:Ignorable="d">
    <Page.Resources>

        <DataTemplateSelector x:Key="vm:MainWindowViewModel"></DataTemplateSelector>
    </Page.Resources>

<ListBox x:Name="lstMainMenu"
 SelectionChanged="lstMainMenu_SelectionChanged"
 Background="Transparent"
 ItemsSource="{Binding ViewModel}">
I'm developing on universal.

1 Answers1

1

What I see, first on "The Final" I don't see where is defined the datacontext of the Page because the datacontext should be:

<Page.DataContext>
  <vm:MainWindowViewModel />
</Page.DataContext/>

Or if you prefer

<Page ... DataContext="{Binding StaticResource=ViewModel}"...>
 <Page.Resources>
  <vm:MainWindowViewModel x:Key="ViewModel"/>
 </Page.Resources>
</Page>

Then there is no 'ViewModel' property inside MainViewModel you defined ViewModels, so it should be

<ListBox x:Name="lstMainMenu" SelectionChanged="lstMainMenu_SelectionChanged" Background="Transparent"
ItemsSource="{Binding ViewModels}">

DataTemplateSelector is empty and is used for other logic.

Juan Pablo Garcia Coello
  • 3,192
  • 1
  • 23
  • 33