IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Bindig item dans context neu à un slider dans mainwindow en VB.NET fonctionne mais pas en XAML


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 21
    Par défaut Bindig item dans context neu à un slider dans mainwindow en VB.NET fonctionne mais pas en XAML
    Bonjour

    J'ai placé un slider SldVol dans l'item d'un contextmenu (pour régler un volume sonore). Je veux effectuer un binding avec un slider Sp sur la mainwindow
    par code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            Dim BindNameSldVolDtmots As New Binding()
            BindNameSldVolDtmots.Source = Sp
            BindNameSldVolDtmots.Mode = BindingMode.TwoWay
            BindNameSldVolDtmots.Path = New PropertyPath("Value")
            SldVol.SetBinding(Slider.ValueProperty, BindNameSldVolDtmots)

    Le binding par code fonctionne bien !!!

    Je n'arrive pas à traduire en XAML ce code .J'ai essayé beaucoup de solution mais pas de binding!
    ElementNAme...Value ... etc . . J'utilise VS2010 et FW4

    Merci

  2. #2
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Ton idée d'utiliser ElementName est bonne.

    Le souci est que les ContextMenus (et il me semble également les ToolTips) ne font pas partie du même NameScope que le reste de l'UI.

    Tu peux ajouter un tuyau pour faire le pont :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public MainWindow()
    {
        InitializeComponent();
     
        NameScope.SetNameScope(cm, NameScope.GetNameScope(this));
    }
    Et après dans le XAML tu peux faire naturellement :
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <ContextMenu x:Name="cm">
        <MenuItem Header="Slider">
            <Slider Value="{Binding ElementName=sp,Path=Value,Mode=TwoWay}" Width="100"></Slider>
        </MenuItem>
    </ContextMenu>

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 21
    Par défaut Merci à l'expert
    Bonjour,

    Cela fonctionne parfaitement .Merci encore.

    J'avais vu que le contextmenu n'est pas dans le visualtree
    mais je ne connaissais pas cette classe pour changer la portée.

    Donc il est impossible à écrire en XAML pur?

    Je ne suis pas expert mais j'ai plusieurs livres sur .NET
    Aucun d'eux ne donne un résumé sur les fonctions principales des classes .
    Je doute que ce genre de document existe.
    Il reste MSDN...si l'on sait ce que l'on cherche .

    Combien d'années pour devenir expert .NET?

    Merci encore

    Cordialemnt

    R.T

  4. #4
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Donc il est impossible à écrire en XAML pur?
    Il me semble qu'il existe des hacks pour le faire en XAML mais c'est clairement moins net que l'utilisation directe du NameScope.
    Ne tombe surtout pas dans le piège du 0 code-behind où on planque tout dans des attached-behaviors et autres usines à gaz, une aberration qui a été promue pendant quelques années, même par des gourous enthousiastes de la communauté WPF/Silverlight, mais aujourd'hui j'ai l'impression que la raison a repris le dessus.
    Là on est clairement dans une problématique de vue donc ça va dans la vue : sa partie XAML ou son code-behind, absolument aucun souci conceptuel.

    Je ne suis pas expert mais j'ai plusieurs livres sur .NET
    Aucun d'eux ne donne un résumé sur les fonctions principales des classes .
    Je doute que ce genre de document existe.
    Il reste MSDN...si l'on sait ce que l'on cherche .
    Oui ce sont des points un peu tricky, qui ne sont souvent pas abordés dans les bouquins même avancés, et qui sont planqués au fond de la doc.
    Et bien sûr tu ne les vois pas dans les démos lors des events parce que ça ne montre pas la technologie sous son meilleur jour, exposant au contraire ses "limitations", ou du moins sa complexité.

    Combien d'années pour devenir expert .NET?
    Impossible de te lâcher un chiffre, ça dépend d'énormément de facteurs :
    - les missions que tu effectues : si tu restes coincé sur du .Net 2.0 tu perds une grande partie de ce qui fait .Net aujourd'hui (en 2010 certaines boîtes étaient encore sous .Net 1.1!)
    - les personnes que tu côtoies : si tu bosses avec des experts ils pourront t'apprendre énormément, avec des vrais exemples de terrain, et tu seras challengé pour monter en compétence, pour ne pas être le tocard de l'équipe (mais bon c'est aussi un piège, la vie ce n'est pas être expert, ce n'est pas une fin en soi, ne pas se laisser avoir par son orgueil et ses complexes )
    - ton investissement personnel : est-ce que tu prends du temps pour faire de la veille, intervenir sur les forums, lire des articles voire en écrire, lire des bouquins...
    - ton mental : si tu n'as pas assez de recul et de pragmatisme tu risque de passer beaucoup de temps sur des sujets qui ont peu d'importance

    De plus la notion d'expert est très flottante : certains commerciaux de SSII te vendront une chèvre comme expert si l'appel d'offre est juteux, parce qu'elle a mangé quelques feuilles de "C# in depth".
    Pour d'autre si tu fais partie des 10% les meilleurs tu es experts, pour d'autres il faut avoir un large spectre, pour d'autres de la profondeur sur un sujet comme C# fait de toi un expert .Net, pour les plus exigeants ça sera les deux...
    Moi-même je ne suis pas à l'aise avec l'utilisation de ce titre parce que je ne suis pas expert sur tout et certains sujets comme le dev Sharepoint me sont complètement étranger.

    Et selon ton projet professionnel devenir expert .Net peut n'avoir aucun intérêt : par exemple j'ai connu un dev .Net qui est passé côté business (trading) ; très clairement être une bête en .Net ne lui aurait servi à rien dans cette optique, donc il s'est plutôt concentré sur les problématiques business.
    Et il n'y a pas de free-lunch : c'est aussi un piège une fois que tu es "expert" car tu as tendance à vouloir toujours plus consolider, ce qui demande énormément de temps, et passer à côté d'autres technos et d'autres opportunités (crois-moi c'est du vécu).

  5. #5
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    Re
    bonjour Pragmateek
    Le binding fonctionne :
    -si les liaisons sont situes dans le slider exterieur "sp"
    -si le datacontext est "mis" sur le form et si contextmenu en herite...

    code xaml:
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    <Window x:Class="Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="300" Width="300">
        <StackPanel >
            <!--la liaison doit etre active ici au niveau exterieur au contextmenu imbrique-->
            <Slider 
                x:Name="sp"
                Maximum="{Binding ElementName=sdVol, Path=Maximum }"
                Minimum="{Binding ElementName=sdVol, Path=Minimum }"
                Value="{Binding ElementName=sdVol, Path=Value }"
                Background="{Binding ElementName=sdVol, Path= Background}" 
     
                Width="{Binding  ElementName=cm, Path=ActualWidth}">
            </Slider>
            <TextBlock  
                    Text="texte1"
                    Height="100"
                    Background="Wheat">
                    <TextBlock.ContextMenu >
                        <ContextMenu
                            x:Name="cm"
                            HorizontalOffset="0"
                            HorizontalAlignment="Stretch"   
                            >
                            <Slider 
                                x:Name="sdVol"
                                Width="{Binding Path=ActualWidth}"
                                Maximum="100"
                                Minimum="0"
                                Value="40"
                                Background="Red"  >
                            </Slider>
                        </ContextMenu>
                    </TextBlock.ContextMenu>
            </TextBlock>
            <TextBlock x:Name="espA"></TextBlock>
            <TextBlock x:Name="espB"></TextBlock>
        </StackPanel>
    </Window>
    code behind .vb du form:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
     
    Public Class Window1
     
        Public Sub New()
     
            ' Cet appel est requis par le concepteur.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
            DataContext = Me
        End Sub
     
        Private Sub Window1_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
            'recupere le datacontext du form
            cm.DataContext = Me.DataContext
            espA.Text = cm.DataContext.ToString()
            espB.Text = sp.DataContext.ToString
        End Sub
    End Class
    bon code.....

  6. #6
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    @Mabrouki : très bonne remarque. +1 mais attention!
    Dans ce sens oui ça marche parce que les éléments référencés via x:Name dans le XAML se retrouvent dans le NameScope de la fenêtre.
    Donc le slider extérieur n'a aucun problème pour référencer le slider du ContextMenu.
    Dans l'autre sens ça ne marche plus puisque le ContextMenu n'a pas de NameScope donc "il ne connait personne".
    Et très souvent c'est du ContextMenu qu'on a besoin de référencer des composants extérieurs comme tu le fais d'ailleurs avec ActualWidth.

    Le DataContext tu ne devrais pas en avoir besoin, tu peux sans doute obtenir le même effet en nommant, via x:Name, la fenêtre elle-même, et en la référençant via ElementName depuis le slider du ContextMenu.
    C'est plus explicite, juste en lisant le XAML on comprend d'où vient la valeur, le DataContext est toujours un outil à utiliser avec modération.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/12/2006, 09h31
  2. valeur du slider dans une scrollbar
    Par jc_cornic dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 05/10/2006, 12h34
  3. Réponses: 1
    Dernier message: 14/05/2006, 11h50
  4. [FAQ][Classpath]Charger ressource dans contexte statique ?
    Par Pill_S dans le forum Général Java
    Réponses: 3
    Dernier message: 14/10/2004, 16h52
  5. [tomcat]acces fichier dans contexte
    Par krollette dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 23/01/2004, 14h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo