Ciao,
Attraverso la barra pulsanti vorrei premendo un pulsante o l'altro visualizzare/nasconder i 2 usercontrol datagrid.
Ok, è possibile usando delle
dependency property personalizzate. Nello user control della barra pulsanti predisponi una dependency property come questa per ogni bottone.
public static readonly DependencyProperty Panel1ToggledProperty =
DependencyProperty.Register("Panel1Toggled", typeof(bool), typeof(Toolbar), new
PropertyMetadata(false));
public bool Panel1Toggled
{
get { return (bool)GetValue(Panel1ToggledProperty); }
set { SetValue(Panel1ToggledProperty, value); }
}
In questo modo lo user control riesce a esporre verso l'esterno lo stato selezionato/deselezionato di un certo bottone contenuto al suo interno.
Io ho chiamato questa dependency property "Panel1Toggled" ma tu ovviamente dagli un nome più significativo e leggibile, tipo "ProductsToggled", se quel bottone serve per mostrare/nascondere i prodotti.
Ora, sempre nello user control della barra pulsanti, metti in binding la proprietà IsChecked del pulsante (o proprietà equivalente) con la dependency property che hai appena creato. Io in questo esempio userò una Checkbox perché non ho idea di quale sia il tipo dei tuoi pulsanti.
<CheckBox Content="Panel1" IsChecked="{Binding Path=Panel1Toggled,
RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"></CheckBox>
In questo modo, ogni qualvolta la checkbox viene cliccata, la dependency property Panel1Toggled rifletterà il suo stato.
Ora vai nella Window che contiene i 3 user control. Non resta che mettere in binding la proprietà Panel1Toggled con la proprietà Visibility dello UserControl che contiene la prima DataGrid.
In questo esempio, la mia barra pulsanti è di un mio tipo personalizzato "Toolbar", mentre il pannello da mostrare/nascondere è una semplice TextBlock.
<local:Toolbar x:Name="Toolbar">
</local:Toolbar>
<TextBlock x:Name="Panel1" Visibility="{Binding ElementName=Toolbar, Path=Panel1Toggled, Converter={StaticResource VisibilityConverter}}">Panel1</TextBlock>
Come vedi ho dovuto usare anche un value converter, perché la dependency property della barra pulsanti è di tipo bool, mentre invece Visibility è di tipo Visibility. Ecco il codice del converter.
public class VisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool)
{
return (bool)value ? Visibility.Visible : Visibility.Collapsed;
}
return Binding.DoNothing;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
E' registrato così dalla Window che contiene i 3 user control
<Window.Resources>
<local:VisibilityConverter x:Key="VisibilityConverter" />
</Window.Resources>
Puoi vedere il tutto in azione in questa immagine:
https://1drv.ms/u/s!Ao4rhSdtDw8rgfEPXAaJjldGMRwHDwnon so come fare a impostare il visibility negli altri 2 usercontrol che hanno i loro datacontext
I DataContext in tutto questo sono irrilevanti dato che stiamo mettendo in binding tra loro delle proprietà di controlli WPF. Infatti, i DataContext potrebbero benissimo essere stati impostati così:
Toolbar.DataContext = "Pippo";
Panel1.DataContext = "Puppo";
Ciao,
Moreno