Skip to content

Commit 8932bc3

Browse files
committed
#53 - Show same package details from browser tab on all other tabs.
1 parent 4202c83 commit 8932bc3

File tree

10 files changed

+388
-165
lines changed

10 files changed

+388
-165
lines changed

src/PackageManager.UI/Views/Browser.xaml

Lines changed: 31 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
66
xmlns:dd="clr-namespace:PackageManager.Views.DesignData"
77
xmlns:controls="clr-namespace:PackageManager.Views.Controls"
8+
xmlns:views="clr-namespace:PackageManager.Views"
89
mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800" d:DataContext="{Binding Source={x:Static dd:ViewModelLocator.Browser}}" Background="White">
910
<DockPanel x:Name="MainPanel">
1011
<StackPanel Margin="8" DockPanel.Dock="Top">
@@ -41,7 +42,7 @@
4142
<RowDefinition Height="Auto" />
4243
</Grid.RowDefinitions>
4344

44-
<ListView x:Name="lvwPackages" ItemsSource="{Binding Packages}" SelectionChanged="lvwPackages_SelectionChanged" BorderThickness="0" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
45+
<ListView x:Name="lvwPackages" SelectedItem="{Binding SelectedPackage, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=views:Browser}}" ItemsSource="{Binding Packages}" SelectionChanged="lvwPackages_SelectionChanged" BorderThickness="0" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
4546
<ListView.ItemTemplate>
4647
<DataTemplate>
4748
<Border Padding="8">
@@ -78,105 +79,39 @@
7879
</Border>
7980

8081
<Border BorderThickness="1" BorderBrush="{StaticResource BorderBrush}" Margin="4,4,8,8" Grid.Column="1">
81-
<ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto">
82-
<StackPanel Margin="8" DataContext="{Binding SelectedItem, ElementName=lvwPackages}" d:DataContext="{Binding Source={x:Static dd:ViewModelLocator.PackageViewModel}}" Visibility="{Binding Converter={StaticResource NullToCollapsedConverter}}">
83-
<StackPanel Orientation="Horizontal">
84-
<StackPanel.DataContext>
82+
<DockPanel Margin="8">
83+
<views:PackageName DockPanel.Dock="Top">
84+
<views:PackageName.Model>
85+
<MultiBinding Converter="{StaticResource FirstNotNullMultiConverter}">
86+
<Binding Path="SelectedVersion.Model" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=views:Browser}" />
87+
<Binding Path="SelectedPackage.Model" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=views:Browser}" />
88+
</MultiBinding>
89+
</views:PackageName.Model>
90+
</views:PackageName>
91+
<StackPanel DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=views:Browser}}" Margin="0,8" Orientation="Horizontal" HorizontalAlignment="Left" DockPanel.Dock="Top">
92+
<Button Content="Install" Command="{Binding ViewModel.Install}" Margin="0,0,8,0">
93+
<Button.CommandParameter>
8594
<MultiBinding Converter="{StaticResource FirstNotNullMultiConverter}">
86-
<Binding Path="SelectedItem" ElementName="cbxVersions" />
87-
<Binding />
95+
<Binding Path="SelectedVersion.Model" />
96+
<Binding Path="SelectedPackage.Model" />
8897
</MultiBinding>
89-
</StackPanel.DataContext>
90-
91-
<Image Source="{Binding IconUrl, Converter={StaticResource NullToDefaultIconConverter}}" Width="33" Height="34" Margin="0,4,8,0" VerticalAlignment="Top" DockPanel.Dock="Left" />
92-
<TextBox Text="{Binding Id, Mode=OneWay}" Style="{StaticResource ReadOnlyTextBoxStyle}" FontSize="20" VerticalAlignment="Center" />
93-
</StackPanel>
94-
95-
<Grid Margin="0,8">
96-
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
97-
<Button Content="Install" Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Border}, Path=DataContext.Install}" Margin="0,0,8,0">
98-
<Button.CommandParameter>
99-
<MultiBinding Converter="{StaticResource FirstNotNullMultiConverter}">
100-
<Binding Path="SelectedItem.Model" ElementName="cbxVersions" />
101-
<Binding Path="Model" />
102-
</MultiBinding>
103-
</Button.CommandParameter>
104-
</Button>
105-
106-
<Button Content="Other versions.." Command="{Binding LoadVersions}" Visibility="{Binding AreVersionsLoaded, Converter={StaticResource FalseToVisibleConverter}}" MinWidth="100" MaxWidth="100" />
107-
<ComboBox x:Name="cbxVersions" ItemsSource="{Binding Versions}" SelectedItem="{Binding Mode=OneWay}" DisplayMemberPath="Version" ItemStringFormat="{}v{0}"
108-
SelectionChanged="cbxVersions_SelectionChanged"
109-
Visibility="{Binding AreVersionsLoaded, Converter={StaticResource TrueToVisibleConverter}}" MinWidth="100" MaxWidth="100" />
110-
</StackPanel>
111-
</Grid>
112-
113-
<StackPanel>
114-
<StackPanel.DataContext>
115-
<MultiBinding Converter="{StaticResource FirstNotNullMultiConverter}">
116-
<Binding Path="SelectedItem" ElementName="cbxVersions" />
117-
<Binding />
118-
</MultiBinding>
119-
</StackPanel.DataContext>
120-
121-
<TextBox Text="{Binding Description, Mode=OneWay}" Style="{StaticResource ReadOnlyTextBoxStyle}" TextWrapping="Wrap" />
122-
123-
<Grid Margin="0,8,0,0">
124-
<Grid.Resources>
125-
<Style TargetType="TextBlock">
126-
<Setter Property="TextWrapping" Value="Wrap" />
127-
</Style>
128-
</Grid.Resources>
98+
</Button.CommandParameter>
99+
</Button>
129100

130-
<Grid.ColumnDefinitions>
131-
<ColumnDefinition Width="0.5*"/>
132-
<ColumnDefinition/>
133-
</Grid.ColumnDefinitions>
134-
<Grid.RowDefinitions>
135-
<RowDefinition/>
136-
<RowDefinition/>
137-
<RowDefinition/>
138-
<RowDefinition/>
139-
<RowDefinition/>
140-
<RowDefinition/>
141-
</Grid.RowDefinitions>
142-
143-
<!-- Version -->
144-
<Label Grid.Row="0" Grid.Column="0" Content="Version:" />
145-
<TextBlock Grid.Row="0" Grid.Column="1">
146-
<Run Text="v" /><Run Text="{Binding Version, Mode=OneWay}" />
147-
</TextBlock>
148-
149-
<!-- Authors -->
150-
<Label Grid.Row="1" Grid.Column="0" Content="Authors:" />
151-
<TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Authors, Mode=OneWay}" />
152-
153-
<!-- License URL -->
154-
<Label Grid.Row="2" Grid.Column="0" Content="License URL:" />
155-
<TextBlock Grid.Row="2" Grid.Column="1">
156-
<Hyperlink NavigateUri="{Binding LicenseUrl, Mode=OneWay}" ToolTip="{Binding LicenseUrl, Mode=OneWay}" RequestNavigate="Hyperlink_RequestNavigate">
157-
<Run Text="{Binding LicenseUrl, Mode=OneWay}"/>
158-
</Hyperlink>
159-
</TextBlock>
160-
161-
<!-- Published Date -->
162-
<Label Grid.Row="3" Grid.Column="0" Content="Published Date:" Visibility="{Binding Published, Converter={StaticResource NullToCollapsedConverter}}"/>
163-
<TextBlock Grid.Row="3" Grid.Column="1" Text="{Binding Published, Mode=OneWay}" Visibility="{Binding Published, Converter={StaticResource NullToCollapsedConverter}}" />
164-
165-
<!-- Project URL -->
166-
<Label Grid.Row="4" Grid.Column="0" Content="Project URL:" />
167-
<TextBlock Grid.Row="4" Grid.Column="1">
168-
<Hyperlink NavigateUri="{Binding ProjectUrl, Mode=OneWay}" ToolTip="{Binding ProjectUrl, Mode=OneWay}" RequestNavigate="Hyperlink_RequestNavigate">
169-
<Run Text="{Binding ProjectUrl, Mode=OneWay}"/>
170-
</Hyperlink>
171-
</TextBlock>
172-
173-
<!-- Tags -->
174-
<Label Grid.Row="5" Grid.Column="0" Content="Tags:" />
175-
<TextBlock Grid.Row="6" Grid.Column="1" Text="{Binding Tags, Mode=OneWay}" Margin="0,0,0,8" />
176-
</Grid>
177-
</StackPanel>
101+
<Button Content="Other versions.." Command="{Binding SelectedPackage.LoadVersions}" Visibility="{Binding SelectedPackage.AreVersionsLoaded, Converter={StaticResource FalseToVisibleConverter}}" MinWidth="100" MaxWidth="100" />
102+
<ComboBox ItemsSource="{Binding SelectedPackage.Versions}" SelectedItem="{Binding SelectedVersion}" DisplayMemberPath="Version" ItemStringFormat="{}v{0}"
103+
SelectionChanged="cbxVersions_SelectionChanged"
104+
Visibility="{Binding SelectedPackage.AreVersionsLoaded, Converter={StaticResource TrueToVisibleConverter}}" MinWidth="100" MaxWidth="100" />
178105
</StackPanel>
179-
</ScrollViewer>
106+
<views:PackageDetail>
107+
<views:PackageDetail.Model>
108+
<MultiBinding Converter="{StaticResource FirstNotNullMultiConverter}">
109+
<Binding Path="SelectedVersion.Model" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=views:Browser}" />
110+
<Binding Path="SelectedPackage.Model" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=views:Browser}" />
111+
</MultiBinding>
112+
</views:PackageDetail.Model>
113+
</views:PackageDetail>
114+
</DockPanel>
180115
</Border>
181116
</Grid>
182117

src/PackageManager.UI/Views/Browser.xaml.cs

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using PackageManager.ViewModels;
22
using System;
33
using System.Collections.Generic;
4-
using System.Diagnostics;
54
using System.Linq;
65
using System.Text;
76
using System.Threading.Tasks;
@@ -38,6 +37,38 @@ private static void OnViewModelChanged(DependencyObject d, DependencyPropertyCha
3837
view.OnViewModelChanged((BrowserViewModel)e.OldValue, (BrowserViewModel)e.NewValue);
3938
}
4039

40+
41+
internal PackageViewModel SelectedPackage
42+
{
43+
get { return (PackageViewModel)GetValue(SelectedPackageProperty); }
44+
set { SetValue(SelectedPackageProperty, value); }
45+
}
46+
47+
internal static readonly DependencyProperty SelectedPackageProperty = DependencyProperty.Register(
48+
"SelectedPackage",
49+
typeof(PackageViewModel),
50+
typeof(Browser),
51+
new PropertyMetadata(null)
52+
);
53+
54+
55+
internal PackageViewModel SelectedVersion
56+
{
57+
get { return (PackageViewModel)GetValue(SelectedVersionProperty); }
58+
set { SetValue(SelectedVersionProperty, value); }
59+
}
60+
61+
internal static readonly DependencyProperty SelectedVersionProperty = DependencyProperty.Register(
62+
"SelectedVersion",
63+
typeof(PackageViewModel),
64+
typeof(Browser),
65+
new PropertyMetadata(null, OnSelectedVersionChanged)
66+
);
67+
68+
private static void OnSelectedVersionChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
69+
{
70+
}
71+
4172
public Browser()
4273
{
4374
InitializeComponent();
@@ -74,15 +105,12 @@ private void OnSearchCompleted()
74105
UpdateInitialMessage(false);
75106
}
76107

77-
private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e)
108+
private void lvwPackages_SelectionChanged(object sender, SelectionChangedEventArgs e)
78109
{
79-
Process.Start(e.Uri.AbsoluteUri);
80-
e.Handled = true;
110+
SelectedVersion = (PackageViewModel)lvwPackages.SelectedItem;
111+
RaiseCanExecuteChangedOnCommands();
81112
}
82113

83-
private void lvwPackages_SelectionChanged(object sender, SelectionChangedEventArgs e)
84-
=> RaiseCanExecuteChangedOnCommands();
85-
86114
private void cbxVersions_SelectionChanged(object sender, SelectionChangedEventArgs e)
87115
=> RaiseCanExecuteChangedOnCommands();
88116

0 commit comments

Comments
 (0)