Skip to content

Commit 3a99af8

Browse files
committed
Specified dataType for compiled binding and set GamePageViewModel as Binding Context
1 parent 5c34890 commit 3a99af8

4 files changed

Lines changed: 30 additions & 32 deletions

File tree

src/Codebreaker.MAUI/Views/Components/GameResultDisplay.xaml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,21 @@
22
<ContentView xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
33
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
44
xmlns:local="clr-namespace:Codebreaker.MAUI.Views.Components"
5+
xmlns:vm="clr-namespace:Codebreaker.ViewModels;assembly=Codebreaker.ViewModels"
56
xmlns:converter="clr-namespace:Codebreaker.MAUI.Converters"
67
x:Class="Codebreaker.MAUI.Views.Components.GameResultDisplay"
7-
x:Name="this">
8-
<!--x:DataType="{Type local:GameResultDisplay}">-->
9-
<!-- When specifying the DataType, the Error "input string was not in a correct format" occurs for the bindings below -->
8+
x:Name="this"
9+
x:DataType="{x:Type vm:GamePageViewModel}">
1010
<Grid>
11-
<VerticalStackLayout IsVisible="{Binding GameMode, Mode=OneWay, Converter={converter:GameStatusToIsVisibleConverter}, ConverterParameter=Won}">
11+
<VerticalStackLayout IsVisible="{Binding GameStatus, Mode=OneWay, Converter={converter:GameStatusToIsVisibleConverter}, ConverterParameter=Won}">
1212
<Image Source="wonanimation_300_opt.gif" IsAnimationPlaying="True" MaximumHeightRequest="300" />
1313
<Label Text="Congratulations - you won the game 🎉🏆" FontSize="20" HorizontalOptions="Center" Margin="0,50,0,20" />
14-
<Button Text="Great, play again" HorizontalOptions="Center" Margin="0,0,0,100" Command="{Binding WonCommand, Mode=OneWay}" IsVisible="{Binding IsWonButtonVisible, Mode=OneWay}" />
14+
<Button Text="Great, play again" HorizontalOptions="Center" Margin="0,0,0,100" Command="{Binding StartGameCommand, Mode=OneTime}" />
1515
</VerticalStackLayout>
16-
<VerticalStackLayout IsVisible="{Binding GameMode, Mode=OneWay, Converter={converter:GameStatusToIsVisibleConverter}, ConverterParameter=Lost}">
16+
<VerticalStackLayout IsVisible="{Binding GameStatus, Mode=OneWay, Converter={converter:GameStatusToIsVisibleConverter}, ConverterParameter=Lost}">
1717
<Image Source="lostanimation_300_opt.gif" IsAnimationPlaying="True" MaximumHeightRequest="300" />
1818
<Label Text="Oh no - you lost the game 😑" FontSize="20" HorizontalOptions="Center" Margin="0,50,0,20" />
19-
<Button Text="Ok, try again" HorizontalOptions="Center" Margin="0,0,0,100" Command="{Binding LostCommand, Mode=OneWay}" IsVisible="{Binding IsLostButtonVisible, Mode=OneWay}" />
19+
<Button Text="Ok, try again" HorizontalOptions="Center" Margin="0,0,0,100" Command="{Binding StartGameCommand, Mode=OneTime}" />
2020
</VerticalStackLayout>
2121
</Grid>
2222
</ContentView>

src/Codebreaker.MAUI/Views/Components/PegSelectionView.xaml

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,22 @@
44
xmlns:local="clr-namespace:Codebreaker.MAUI.Views.Components"
55
xmlns:conv="clr-namespace:Codebreaker.MAUI.Converters"
66
xmlns:vm="clr-namespace:Codebreaker.ViewModels;assembly=Codebreaker.ViewModels"
7+
xmlns:vmComponents="clr-namespace:Codebreaker.ViewModels.Components;assembly=Codebreaker.ViewModels"
78
xmlns:pages="clr-namespace:Codebreaker.MAUI.Views.Pages"
89
x:Class="Codebreaker.MAUI.Views.Components.PegSelectionView"
9-
x:Name="PegSelectionViewControl">
10+
x:Name="PegSelectionViewControl"
11+
x:DataType="{x:Type vm:GamePageViewModel}">
1012
<ContentView.Resources>
1113
<conv:DictionaryToValuesConverter x:Key="DictionaryToValuesConverter" />
1214
</ContentView.Resources>
1315
<HorizontalStackLayout Margin="10,0"
14-
BindableLayout.ItemsSource="{Binding Path=ViewModel.Fields, Mode=OneWay}">
16+
BindableLayout.ItemsSource="{Binding Path=Fields, Mode=OneWay}">
1517
<BindableLayout.ItemTemplate>
1618
<DataTemplate>
1719
<Picker
1820
x:Name="PegSelectionPicker"
19-
ItemsSource="{Binding Path=BindingContext.ViewModel.Game.FieldValues, Converter={StaticResource DictionaryToValuesConverter}, ConverterParameter='colors', Mode=OneWay, Source={x:Reference PegSelectionViewControl}}"
21+
x:DataType="{x:Type vmComponents:SelectedFieldViewModel}"
22+
ItemsSource="{Binding Path=BindingContext.Game.FieldValues, Converter={StaticResource DictionaryToValuesConverter}, ConverterParameter='colors', Mode=OneWay, Source={x:Reference PegSelectionViewControl}}"
2023
SelectedItem="{Binding Value, Mode=TwoWay}"
2124
Background="DarkGray"
2225
TextColor="White"

src/Codebreaker.MAUI/Views/Pages/GamePage.xaml

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,28 @@
22
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
33
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
44
xmlns:local="clr-namespace:Codebreaker.MAUI.Views.Pages"
5+
xmlns:vm="clr-namespace:Codebreaker.ViewModels;assembly=Codebreaker.ViewModels"
56
xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
67
xmlns:components="clr-namespace:Codebreaker.MAUI.Views.Components"
78
xmlns:conv="clr-namespace:Codebreaker.MAUI.Converters"
89
Title="Codebreaker"
910
x:Class="Codebreaker.MAUI.Views.Pages.GamePage"
11+
x:DataType="{x:Type vm:GamePageViewModel}"
1012
x:Name="this">
1113

1214
<ContentPage.Resources>
1315
<conv:GameStatusToIsVisibleConverter x:Key="GameStatusVisibleConverter" />
1416
</ContentPage.Resources>
1517
<Grid RowDefinitions="auto, *, auto">
1618
<components:GameResultDisplay
17-
Grid.Row="0"
18-
GameMode="{Binding ViewModel.GameStatus, Mode=OneWay, Source={x:Reference this}}"
19-
WonCommand="{Binding ViewModel.StartGameCommand, Mode=OneTime, Source={x:Reference this}}"
20-
LostCommand="{Binding ViewModel.StartGameCommand, Mode=OneTime, Source={x:Reference this}}" />
19+
Grid.Row="0" />
2120
<ScrollView Grid.Row="1">
2221
<VerticalStackLayout
2322
Spacing="25"
2423
Padding="30,0"
2524
VerticalOptions="FillAndExpand">
2625
<ActivityIndicator
27-
IsRunning="{Binding ViewModel.InProgress, Mode=OneWay}"
26+
IsRunning="{Binding InProgress, Mode=OneWay}"
2827
HorizontalOptions="Center"
2928
VerticalOptions="Center" />
3029

@@ -33,7 +32,7 @@
3332
ColumnDefinitions="*, Auto"
3433
ColumnSpacing="8"
3534
RowSpacing="8"
36-
IsVisible="{Binding ViewModel.GameStatus, Mode=OneWay, Converter={StaticResource GameStatusVisibleConverter}, ConverterParameter=Start}">
35+
IsVisible="{Binding GameStatus, Mode=OneWay, Converter={StaticResource GameStatusVisibleConverter}, ConverterParameter=Start}">
3736
<Label
3837
Grid.Column="0"
3938
Grid.Row="0"
@@ -43,8 +42,8 @@
4342
<Entry
4443
Grid.Column="0"
4544
Grid.Row="1"
46-
IsEnabled="{Binding ViewModel.IsNameEnterable, Mode=OneWay}"
47-
Text="{Binding ViewModel.Name, Mode=TwoWay }"
45+
IsEnabled="{Binding IsNameEnterable, Mode=OneWay}"
46+
Text="{Binding Name, Mode=TwoWay }"
4847
Placeholder="Enter your name"/>
4948
<Button
5049
Grid.Column="1"
@@ -54,18 +53,18 @@
5453
VerticalOptions="EndAndExpand"
5554
Text="Start the game"
5655
IsVisible="{OnIdiom
57-
Default={Binding ViewModel.GameStatus, Mode=OneWay, Converter={StaticResource GameStatusVisibleConverter}, ConverterParameter=Start},
56+
Default={Binding GameStatus, Mode=OneWay, Converter={StaticResource GameStatusVisibleConverter}, ConverterParameter=Start},
5857
Phone=False,
5958
Watch=False
6059
}"
61-
Command="{Binding ViewModel.StartGameCommand, Mode=OneTime}" />
60+
Command="{Binding StartGameCommand, Mode=OneTime}" />
6261
</Grid>
6362

64-
<components:PegSelectionView IsVisible="{Binding ViewModel.GameStatus, Mode=OneWay, Converter={StaticResource GameStatusVisibleConverter}, ConverterParameter=Cancelable}" />
63+
<components:PegSelectionView IsVisible="{Binding GameStatus, Mode=OneWay, Converter={StaticResource GameStatusVisibleConverter}, ConverterParameter=Cancelable}" />
6564

6665
<ListView
67-
IsVisible="{Binding ViewModel.GameStatus, Mode=OneWay, Converter={StaticResource GameStatusVisibleConverter}, ConverterParameter=Running}"
68-
ItemsSource="{Binding ViewModel.GameMoves, Mode=OneWay}"
66+
IsVisible="{Binding GameStatus, Mode=OneWay, Converter={StaticResource GameStatusVisibleConverter}, ConverterParameter=Running}"
67+
ItemsSource="{Binding GameMoves, Mode=OneWay}"
6968
ItemTemplate="{StaticResource PegsTemplate}"/>
7069

7170
</VerticalStackLayout>
@@ -79,16 +78,16 @@
7978
Text="Start the game"
8079
IsVisible="{OnIdiom
8180
Default=False,
82-
Phone={Binding ViewModel.GameStatus, Mode=OneWay, Converter={StaticResource GameStatusVisibleConverter}, ConverterParameter=Start}
81+
Phone={Binding GameStatus, Mode=OneWay, Converter={StaticResource GameStatusVisibleConverter}, ConverterParameter=Start}
8382
}"
84-
Command="{Binding ViewModel.StartGameCommand, Mode=OneTime}" />
83+
Command="{Binding StartGameCommand, Mode=OneTime}" />
8584
<Button
8685
Margin="20"
8786
HorizontalOptions="Fill"
8887
VerticalOptions="End"
8988
Text="Move"
90-
IsVisible="{Binding ViewModel.GameStatus, Mode=OneWay, Converter={StaticResource GameStatusVisibleConverter}, ConverterParameter=Cancelable}"
91-
Command="{Binding ViewModel.SetMoveCommand, Mode=OneTime}" />
89+
IsVisible="{Binding GameStatus, Mode=OneWay, Converter={StaticResource GameStatusVisibleConverter}, ConverterParameter=Cancelable}"
90+
Command="{Binding SetMoveCommand, Mode=OneTime}" />
9291
</VerticalStackLayout>
9392
</Grid>
9493
</ContentPage>

src/Codebreaker.MAUI/Views/Pages/GamePage.xaml.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,12 @@ public partial class GamePage : ContentPage
55

66
public GamePage(GamePageViewModel viewModel)
77
{
8-
ViewModel = viewModel;
9-
10-
BindingContext = this;
8+
BindingContext = viewModel;
119
InitializeComponent();
1210

1311
WeakReferenceMessenger.Default.Register<InfoMessage>(this, async (r, m) =>
1412
{
1513
await DisplayAlert("Info", m.Text, "Close");
1614
});
1715
}
18-
19-
public GamePageViewModel ViewModel { get; }
2016
}

0 commit comments

Comments
 (0)