codice:
// Poi nella prima finestra imposto l'id
MyAlbum myAlb = new MyAlbum();
myAlb.IdAlbum = Convert.ToInt32( idAlbum.ToString());
// e nella seconda (dettaglio) me lo vorrei riprendere
MyAlbum myAlb = new MyAlbum();
txtIdAlbumDaClasse.Text = myAlb.IdAlbum.ToString();
essendo che dichiari un nuovo oggetto (new), sicuramente non potrà possedere i dati di quello precedente,
il concetto che utilizzi invece nella prima soluzione è più ragionevole chiaramente puoi estenderlo in maniera più efficiente ed efficace
ora come ora hai definito la struttura modello che è (concetto simile) così (*M* v vm):
codice:
//Album.cs
/// <summary>
/// Definisce una struttura che rappresenta un oggetto di tipo Album.
/// </summary>
public class Album
{
/// <summary>
/// Ottiene o setta l'identificativo.
/// </summary>
public int ID { get; set; }
/// <summary>
/// Ottiene o setta l nome.
/// </summary>
public string Name { get; set; }
/// <summary>
/// Ottiene o setta il cognome.
/// </summary>
public int Year { get; set; }
/// <summary>
/// Ottiene o setta la durata.
/// </summary>
public TimeSpan Duration { get; set; }
/// <summary>
/// Ottiene o setta il nome dell'immagine.
/// </summary>
public string ImageFileName { get; set; }
/// <summary>
/// Costruttore.
/// </summary>
public Album() { }
}
inoltre possiedi la finestra principale che è rappresentata (concetto simile) cosi (m *V* vm):
codice:
//MainWindow.xaml
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2...l/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/ma...atibility/2006"
xmlns:local="clr-namespace:WpfApplication1"
mc:Ignorable="d"
Title="Album viewer" Height="350" Width="525" WindowStartupLocation="CenterScreen" Loaded="Window_Loaded">
<Grid>
<DataGrid x:Name="dgAlbums" AutoGenerateColumns="False" Margin="0,20,0,0">
<DataGrid.Columns>
<DataGridHyperlinkColumn Header="ID" Binding="{Binding ID}" Width="*">
<DataGridHyperlinkColumn.ElementStyle>
<Style>
<EventSetter Event="Hyperlink.Click" Handler="Hyperlink_Click"/>
</Style>
</DataGridHyperlinkColumn.ElementStyle>
</DataGridHyperlinkColumn>
<DataGridTextColumn Binding="{Binding Name}" Header="Nome" Width="6*"></DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Year}" Header="Anno" Width="3*"></DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Duration, StringFormat=hh\\:mm\\:ss}" Header="Durata" Width="3*"></DataGridTextColumn>
<DataGridTextColumn Binding="{Binding ImageFileName}" Header="Immagine" Width="6*">
<DataGridTextColumn.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="ToolTip">
<Setter.Value>
<Image Source="{Binding ImageFileName}" Width="80" Height="80" Stretch="Fill" />
</Setter.Value>
</Setter>
</Style>
</DataGridTextColumn.CellStyle>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
i tuoi hyperlink associati alla singola riga ti rappresentano il record definito dalla struttura il quale allo scaturire dell'evento click lo gestisci (concetto simile) cosi (m v *VM*):
codice:
// MainWindow.cs
/// <summary>
/// Risponde all'evento Hyperlink_Click.
/// </summary>
/// <param name="sender">Mandante dell'evento.</param>
/// <param name="e">Contains state information and event data associated with a routed event.</param>
private void Hyperlink_Click(object sender, RoutedEventArgs e)
{
Hyperlink hyperlink = e.OriginalSource as Hyperlink;
Album album = (Album)hyperlink.DataContext;
AlbumDetailWindow detailWindow = new AlbumDetailWindow(album);
detailWindow.Owner = this;
detailWindow.Show();
}
ora quando attivi la tua nuova finestra (o pagina) che vuoi che ti fornisca i dettagli o quant'altro del preciso oggetto, passa tale oggetto per intero al contesto della finestra (mantieni un VM), prassi molto più comoda di impostare le singole proprietà
quindi la tua nuova finestra (o pagina) di dettaglio (concetto simile) viene definita cosi (m *V* vm):
codice:
//AlbumDetailWindow.xaml
<Window x:Class="WpfApplication1.AlbumDetailWindow"
xmlns="http://schemas.microsoft.com/winfx/2...l/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/ma...atibility/2006"
xmlns:local="clr-namespace:WpfApplication1"
mc:Ignorable="d"
Title="AlbumDetailWindow" Height="170" Width="350" WindowStartupLocation="CenterOwner" ResizeMode="NoResize" Initialized="Window_Initialized">
<Grid x:Name="gContext">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="5"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Separator Grid.Row="1"></Separator>
<TextBlock TextWrapping="Wrap" Text="{Binding Name}" Margin="10, 10, 10, 5" FontSize="14" FontFamily="SketchFlow Print" FontWeight="Bold"/>
<Grid Margin="5" Grid.Row="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="1" Orientation="Vertical">
<WrapPanel Margin="2" >
<TextBlock TextWrapping="Wrap" Text="ID:" FontWeight="Bold" Margin="0,0,5,0"/>
<TextBlock TextWrapping="Wrap" Text="{Binding ID}"/>
</WrapPanel>
<WrapPanel Margin="2" >
<TextBlock TextWrapping="Wrap" Text="Nome:" FontWeight="Bold" Margin="0,0,5,0"/>
<TextBlock TextWrapping="Wrap" Text="{Binding Name}"/>
</WrapPanel>
<WrapPanel Margin="2" >
<TextBlock TextWrapping="Wrap" Text="Anno:" FontWeight="Bold" Margin="0,0,5,0"/>
<TextBlock TextWrapping="Wrap" Text="{Binding Year}"/>
</WrapPanel>
<WrapPanel Margin="2" >
<TextBlock TextWrapping="Wrap" Text="Durata:" FontWeight="Bold" Margin="0,0,5,0"/>
<TextBlock TextWrapping="Wrap" Text="{Binding Duration, StringFormat=hh\\:mm\\:ss}"/>
</WrapPanel>
</StackPanel>
<Image x:Name="iIcon" Margin="5" HorizontalAlignment="Left" Height="80" VerticalAlignment="Top" Width="80" Source="{Binding ImageFileName}" Stretch="Fill"/>
</Grid>
</Grid>
</Window>
utilizzando la stessa tecnica del data-binding eseguito per la griglia, definisci il contesto della finestra, la quale tramite quanto dettato dallo xaml, ti determinerà i dati visuali seguendo il modello (m v *VM*)
codice:
// AlbumDetailWindow.cs
/// <summary>
/// Interaction logic for AlbumDetailWindow.xaml
/// </summary>
public partial class AlbumDetailWindow : Window
{
private Album m_Album;
/// <summary>
/// Ottiene l'album associato.
/// </summary>
public Album Album
{
get { return m_Album; }
}
/// <summary>
/// Costruttore.
/// </summary>
public AlbumDetailWindow()
{
this.InitializeComponent();
}
/// <summary>
/// Costruttore.
/// </summary>
/// <param name="album">Imposta l'album di contesto.</param>
public AlbumDetailWindow(Album album)
{
m_Album = album;
this.InitializeComponent();
}
/// <summary>
/// Risponde all'evento Window_Initialized.
/// </summary>
/// <param name="sender">Mandante dell'evento.</param>
/// <param name="e">Represents the base class for classes that contain event data, and provides a
/// value to use for events that do not include event data.</param>
private void Window_Initialized(object sender, EventArgs e)
{
Title = m_Album.ID + " - " + m_Album.Name;
gContext.DataContext = m_Album;
}
}
da quanto puoi vedere non vi è nulla di particolare da fare a livello logico, inoltre noti che l'oggetto Album dato alla finestra dei dettagli è il medesimo di quello della griglia, infatti al cambio di uno muta anche l'altro (stesso riferimento),
Album viewer.jpg
Album viewer details.jpg
questo è chiaramente un esempio, la personalizzazione è determinata per intero dalle tue esigenze di progetto