19 messaggi dal 08 marzo 2005
Salve a tutti

Premetto che sto parlando d un prog. c# wpf non asp.net e che sono all'inizio di mvvm

Ho una window con 3 usercontrol
1 è una barra pulsanti e gli altri 2 hanno 2 diverse datagrid

Attraverso la barra pulsanti vorrei premendo un pulsante o l'altro visualizzare/nasconder i 2 usercontrol datagrid.

Però lo usercontrol barra pulsanti ha il suo datacontext per cui non so come fare a impostare il visibility negli altri 2 usercontrol che hanno i loro datacontext

Qualcuno sa darmi una dritta su come fare?
11.886 messaggi dal 09 febbraio 2002
Contributi
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!Ao4rhSdtDw8rgfEPXAaJjldGMRwHDw

non 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

Enjoy learning and just keep making
19 messaggi dal 08 marzo 2005
Intanto ti ringrazio per la gentilezza e per l'ottima spiegazione.
La tua soluzione è certamente ottima (soprattutto nel concetto del esclusione del datacontext) però siccome sto lavorando in mvvm (principiante !!) non mi ero accorto che inserendo gli user control in un window :

        <local:UserControl1 HorizontalAlignment="Left" Height="100" Margin="85,60,0,0" VerticalAlignment="Top" Width="100" Visibility="{Binding visVis1}"/>
        <local:UserControlCmd1 HorizontalAlignment="Left" Height="100" Margin="472,306,0,0" VerticalAlignment="Top" Width="100"/>


e mettendo un datacontext alla window base :
            var fer = new ClassDatacontext1();
            this.DataContext = fer;


Anche gli usercontrol condividono lo stesso datacontext per cui mettendo il visibility in un usercontrol:
<UserControl x:Class="MVVM_UserControl.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:MVVM_UserControl"
             mc:Ignorable="d" Height="104.6" Width="111" Visibility="{Binding visVis, Mode=TwoWay}">
    <Grid Margin="0,0,550,-0.4">


e il comando in un altro :


<UserControl x:Class="MVVM_UserControl.UserControlCmd1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:MVVM_UserControl"
             mc:Ignorable="d" Background="Transparent" Height="87.359" Width="134.65">
    <Grid Margin="0,0,641,317.6">
        <Button Content="Button" HorizontalAlignment="Left" Height="73" Margin="0,0,-119,-73" VerticalAlignment="Top" Width="119" Command="{Binding cmdHide1}" Background="Blue"/>
    </Grid>
</UserControl>



posso gestire il datacontext base :
   Visibility _visVis1;
        public Visibility visVis1
        {
            get { return _visVis1; }

            set
            {
                _visVis1 = value;
                base.OnPropertyChanged("visVis1");
            }
        }

        public ClassDatacontext1()
        {
            cmdHide1 = new Command1(cmdHide1_exe, cmdHide1_canexe);

            visVis1 = Visibility.Visible;
        }

        private bool cmdHide1_canexe(object arg)
        {
            return true;
        }

        private void cmdHide1_exe(object obj)
        {
            visVis1 = Visibility.Hidden;
        }


Ti chiedo un ultima cosa ,come hai fatto a registrare e inserire in video in onedrive?

Grazie ancora
Modificato da atjbat il 05 luglio 2019 13:16 -
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao, va bene.
Quella è una gif animata che ho registrato con ScreenToGif, un programma gratuito.

Ciao ciao,
Moreno

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.