Skip to content

Commit

Permalink
updating Sandbox app to follow better MVVM patterns
Browse files Browse the repository at this point in the history
  • Loading branch information
dansiegel committed Feb 10, 2019
1 parent ab1b6ad commit 2b503a2
Show file tree
Hide file tree
Showing 15 changed files with 111 additions and 159 deletions.
2 changes: 2 additions & 0 deletions Sandbox/Windows10/HelloWorld/HelloWorld.Unity/App.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using Prism.Unity;
using Sample.ViewModels;
using Sample.Views;
using SampleData.StarTrek;
using System;
using System.Collections.Generic;
using System.IO;
Expand Down Expand Up @@ -32,6 +33,7 @@ public App()

protected override void RegisterTypes(IContainerRegistry container)
{
container.RegisterSingleton<IDatabase, Database>();
container.RegisterForNavigation<MainPage, MainPageViewModel>();
container.RegisterForNavigation<ItemPage, ItemPageViewModel>();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using System;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Data;

namespace HelloWorld.Converters
{
public class ItemClickedConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
if (value is ItemClickEventArgs args)
return args.ClickedItem;

return null;
}

public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotImplementedException();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@
<DependentUpon>App.xaml</DependentUpon>
</Compile>
<Compile Include="Controls\AppBarLiteral.cs" />
<Compile Include="Converters\ItemClickedConverter.cs" />
<Compile Include="Models\GroupedMembers.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="ViewModels\ItemPageViewModel.cs" />
Expand Down Expand Up @@ -147,6 +148,9 @@
<PackageReference Include="Microsoft.NETCore.UniversalWindowsPlatform">
<Version>6.1.9</Version>
</PackageReference>
<PackageReference Include="Microsoft.Xaml.Behaviors.Uwp.Managed">
<Version>2.0.0</Version>
</PackageReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\Source\Prism\Prism.csproj">
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Prism.Mvvm;
using Prism.Commands;
using Prism.Mvvm;
using Prism.Navigation;
using SampleData.StarTrek;
using Windows.UI.Xaml.Media.Animation;
Expand All @@ -7,25 +8,17 @@ namespace Sample.ViewModels
{
internal class ItemPageViewModel : BindableBase, INavigatedAware
{
private INavigationService _nav;
private INavigationService _navigationService { get; }

public ItemPageViewModel()
public ItemPageViewModel(INavigationService navigationService)
{
// empty
_navigationService = navigationService;
GoBackCommand = new DelegateCommand(OnGoBackCommandExecuted);
}

public void OnNavigatedTo(INavigationParameters parameters)
{
_nav = parameters.GetNavigationService();
if (parameters.TryGetValue<string>(nameof(Member), out var parameter))
{
if (Member.TryFromJson(parameter, out var member))
{
Member = member;
}
else { /* invalid parameter */ }
}
else { /* missing parameter */ }
Member = parameters.GetValue<Member>("member");
}

public void OnNavigatedFrom(INavigationParameters parameters)
Expand All @@ -40,9 +33,11 @@ public Member Member
set => SetProperty(ref _member, value);
}

public async void GoBack()
public DelegateCommand GoBackCommand { get; }

private async void OnGoBackCommandExecuted()
{
await _nav.GoBackAsync();
await _navigationService.GoBackAsync();
}
}
}
Original file line number Diff line number Diff line change
@@ -1,40 +1,33 @@
using Prism.Mvvm;
using Prism.Commands;
using Prism.Mvvm;
using Prism.Navigation;
using Sample.Models;
using SampleData.StarTrek;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media.Animation;

namespace Sample.ViewModels
{
class MainPageViewModel : BindableBase, INavigatedAwareAsync
{
private static readonly Database _data;
private IDatabase _data { get; }

static MainPageViewModel()
{
_data = new Database();
}

private INavigationService _nav;
private INavigationService _navigationService { get; }

public MainPageViewModel()
public MainPageViewModel(IDatabase data, INavigationService navigationService)
{
PropertyChanged += (s, e) =>
{
if (e.PropertyName.Equals(nameof(SearchString)))
{
FillMembers();
}
};
_data = data;
_navigationService = navigationService;
ItemSelectedCommand = new DelegateCommand<Member>(OnItemSelectedCommandExecuted);
}

public async Task OnNavigatedToAsync(INavigationParameters parameters)
{
_nav = parameters.GetNavigationService();
await _data.OpenAsync();
FillMembers();
}
Expand All @@ -45,9 +38,11 @@ public async Task OnNavigatedToAsync(INavigationParameters parameters)
public string SearchString
{
get => _searchString;
set => SetProperty(ref _searchString, value);
set => SetProperty(ref _searchString, value, onChanged: FillMembers);
}

public DelegateCommand<Member> ItemSelectedCommand { get; }

private void FillMembers()
{
Members.Clear();
Expand All @@ -71,12 +66,9 @@ IEnumerable<Member> GetFilteredMembers(Show show)
}
}

public async void ItemClick(object sender, Windows.UI.Xaml.Controls.ItemClickEventArgs e)
private async void OnItemSelectedCommandExecuted(Member member)
{
if (e.ClickedItem is Member m)
{
await _nav.NavigateAsync(nameof(Views.ItemPage), new DrillInNavigationTransitionInfo(), (nameof(Member), m.ToJson()));
}
await _navigationService.NavigateAsync("ItemPage", new DrillInNavigationTransitionInfo(), ("member", member));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
x:Class="Sample.Views.ItemPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Sample.Views"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Expand All @@ -12,29 +11,29 @@
<CommandBar IsDynamicOverflowEnabled="False">
<CommandBar.Content>
<StackPanel Orientation="Horizontal">
<Button Style="{StaticResource TextBlockButtonStyle}" Height="48" Width="52" Click="{x:Bind ViewModel.GoBack}" AccessKey="b">
<Button Style="{StaticResource TextBlockButtonStyle}" Height="48" Width="52" Command="{Binding GoBackCommand}" AccessKey="b">
<SymbolIcon Symbol="Back" />
</Button>
<TextBlock Text="{x:Bind ViewModel.Member.Character}" Margin="8,0" VerticalAlignment="Center" Style="{StaticResource TitleTextBlockStyle}" />
<TextBlock Text="{Binding Member.Character}" Margin="8,0" VerticalAlignment="Center" Style="{StaticResource TitleTextBlockStyle}" />
</StackPanel>
</CommandBar.Content>
</CommandBar>
</Page.TopAppBar>

<Grid Width="400" Height="400">
<Grid.Background>
<ImageBrush ImageSource="{x:Bind ViewModel.Member.Image.Path}" Stretch="UniformToFill" />
<ImageBrush ImageSource="{Binding Member.Image.Path}" Stretch="UniformToFill" />
</Grid.Background>
<StackPanel VerticalAlignment="Bottom" Padding="16">
<StackPanel.Background>
<SolidColorBrush Color="Black" Opacity=".5" />
</StackPanel.Background>
<TextBlock Text="{x:Bind ViewModel.Member.Character}" Style="{StaticResource HeaderTextBlockStyle}" TextWrapping="NoWrap" TextTrimming="CharacterEllipsis" Foreground="White" />
<TextBlock Text="{Binding Member.Character}" Style="{StaticResource HeaderTextBlockStyle}" TextWrapping="NoWrap" TextTrimming="CharacterEllipsis" Foreground="White" />
<TextBlock Style="{StaticResource CaptionTextBlockStyle}" TextWrapping="NoWrap" TextTrimming="CharacterEllipsis" Foreground="White">
<Run Text="{x:Bind ViewModel.Member.Species}" />
<Run Text="{x:Bind ViewModel.Member.Gender}" />
<Run Text="{Binding Member.Species}" />
<Run Text="{Binding Member.Gender}" />
</TextBlock>
<TextBlock Text="{x:Bind ViewModel.Member.Actor}" Style="{StaticResource SubheaderTextBlockStyle}" TextWrapping="NoWrap" TextTrimming="CharacterEllipsis" Foreground="White" />
<TextBlock Text="{Binding Member.Actor}" Style="{StaticResource SubheaderTextBlockStyle}" TextWrapping="NoWrap" TextTrimming="CharacterEllipsis" Foreground="White" />
</StackPanel>
</Grid>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,5 @@ public ItemPage()
{
InitializeComponent();
}

ViewModels.ItemPageViewModel ViewModel => DataContext as ViewModels.ItemPageViewModel;
}
}
29 changes: 21 additions & 8 deletions Sandbox/Windows10/HelloWorld/HelloWorld.Unity/Views/MainPage.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,34 +2,47 @@
x:Class="Sample.Views.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Sample.Views"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:i="using:Microsoft.Xaml.Interactivity"
xmlns:core="using:Microsoft.Xaml.Interactions.Core"
xmlns:models="using:SampleData.StarTrek"
xmlns:viewmodels="using:Sample.ViewModels"
xmlns:converter="using:HelloWorld.Converters"
xmlns:controls="using:Sample.Controls"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

<Page.Resources>
<CollectionViewSource x:Name="cvs" IsSourceGrouped="True" Source="{x:Bind ViewModel.Members}" ItemsPath="Members" />
<CollectionViewSource x:Name="cvs" IsSourceGrouped="True" Source="{Binding Members}" ItemsPath="Members" />
<converter:ItemClickedConverter x:Name="itemClickedConverter" />
</Page.Resources>

<Page.TopAppBar>
<CommandBar IsDynamicOverflowEnabled="False">
<CommandBar.Content>
<TextBlock Text="Star Trek" VerticalAlignment="Center" Margin="16,8,0,0"
Style="{StaticResource TitleTextBlockStyle}" />
<TextBlock Text="Star Trek"
VerticalAlignment="Center"
Margin="16,8,0,0"
Style="{StaticResource TitleTextBlockStyle}" />
</CommandBar.Content>
<controls:AppBarLiteral>
<AutoSuggestBox QueryIcon="Find" PlaceholderText="Search" Width="250" Margin="0,8,4,0"
Text="{x:Bind ViewModel.SearchString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<AutoSuggestBox QueryIcon="Find"
PlaceholderText="Search"
Width="250"
Margin="0,8,4,0"
Text="{Binding SearchString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</controls:AppBarLiteral>
<AppBarButton Label="Info" Icon="World" AccessKey="i" />
</CommandBar>
</Page.TopAppBar>

<GridView ItemsSource="{Binding Source={StaticResource cvs}}" IsItemClickEnabled="True" ItemClick="{x:Bind ViewModel.ItemClick}">
<GridView ItemsSource="{Binding Source={StaticResource cvs}}" IsItemClickEnabled="True">
<i:Interaction.Behaviors>
<core:EventTriggerBehavior EventName="ItemClick">
<core:InvokeCommandAction Command="{Binding ItemSelectedCommand}"
InputConverter="{StaticResource itemClickedConverter}" />
</core:EventTriggerBehavior>
</i:Interaction.Behaviors>
<GridView.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderContainerStyle>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,5 @@ public MainPage()
{
InitializeComponent();
}

ViewModels.MainPageViewModel ViewModel => DataContext as ViewModels.MainPageViewModel;
}
}
16 changes: 16 additions & 0 deletions Sandbox/Windows10/SampleData/IDatabase.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using System.Threading.Tasks;

namespace SampleData.StarTrek
{
public interface IDatabase
{
string[] Genders { get; }
Member[] Members { get; }
bool Open { get; }
Ship[] Ships { get; }
Show[] Shows { get; }
string[] Species { get; }

Task<bool> OpenAsync();
}
}
1 change: 1 addition & 0 deletions Sandbox/Windows10/SampleData/SampleData.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@
<Compile Include="Email\Database.cs" />
<Compile Include="Email\Message.cs" />
<Compile Include="Email\Recipient.cs" />
<Compile Include="IDatabase.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="StarTrek\Database.cs" />
<Compile Include="StarTrek\Image.cs" />
Expand Down
2 changes: 1 addition & 1 deletion Sandbox/Windows10/SampleData/StarTrek/Database.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

namespace SampleData.StarTrek
{
public class Database
public class Database : IDatabase
{
public Member[] Members { get; private set; }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,16 +41,6 @@ public static NavigationMode GetNavigationMode(this INavigationParameters parame
return (parameters as INavigationParametersInternal).GetValue<NavigationMode>(nameof(NavigationMode));
}

public static INavigationService GetNavigationService(this INavigationParameters parameters)
{
if (!(parameters as INavigationParametersInternal).ContainsKey(nameof(NavigationService)))
{
return null;
}

return (parameters as INavigationParametersInternal).GetValue<INavigationService>(nameof(NavigationService));
}

public static SynchronizationContext GetSynchronizationContext(this INavigationParameters parameters)
{
if (!(parameters as INavigationParametersInternal).ContainsKey(nameof(SynchronizationContext)))
Expand Down
Loading

0 comments on commit 2b503a2

Please sign in to comment.