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

Windows Presentation Foundation Discussion :

Problème de définition de datacontext [MVVM]


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Août 2012
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 4
    Par défaut Problème de définition de datacontext
    Bonjour,
    Débutant en WPF,

    J'ai un usercontrol B contenant deux radio boutons. J'aimerai utiliser ce usercontrol dans un usercontrol A.
    Le souci, c'est que j'aimerai binder B avec un view model instancier dans le constructeur du view model de A. C'est la que j'ai mon erreur.

    View B
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    <UserControl x:Class="TestModeView.View.Common.ModeView"
                 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:common="clr-namespace:TestModeView.ViewModel.Common"
                 mc:Ignorable="d" 
                 d:DesignHeight="50" d:DesignWidth="300"
                 Background="{StaticResource MainBackground}">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
     
            <Grid.Resources>
                <common:EnumBooleanConverter x:Key="enumBooleanConverter"/>
            </Grid.Resources>
     
            <RadioButton GroupName="SimulatorMode" 
                                 Grid.Column="0" HorizontalAlignment="Center" 
                                 Content="Mode 1" 
                                 Margin="{StaticResource ModeMargin}"
                                 IsChecked="{Binding Path=Mode, Mode=TwoWay, 
                                             Converter={StaticResource enumBooleanConverter},
                                             ConverterParameter=0}"
                                 IsEnabled="{Binding Path=IsEnable,  UpdateSourceTrigger=PropertyChanged}" 
                            />
            <RadioButton GroupName="SimulatorMode" 
                                 Grid.Column="1" HorizontalAlignment="Center" 
                                 Content="Mode 2" 
                                 Margin="{StaticResource ModeMargin}"
                                 IsChecked="{Binding Path=Mode, Mode=TwoWay, 
                                             Converter={StaticResource enumBooleanConverter},
                                             ConverterParameter=1}"
                                 IsEnabled="{Binding Path=IsEnable,  UpdateSourceTrigger=PropertyChanged}" 
                            />
        </Grid>
    </UserControl>
    Code View A
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    <UserControl x:Class="TestModeView.View.ServerView"
                 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:View="clr-namespace:TestModeView.View.Common" 
                 mc:Ignorable="d" 
                 d:DesignWidth="300"
                 Background="{StaticResource MainBackground}">
        <!--
        xmlns:my="clr-namespace:TestModeView.ViewModel.Common"
                 Background="{StaticResource MainBackground}">
     
                -->
        <!-- Control border -->
        <Border BorderThickness="1" BorderBrush="{StaticResource BorderColor}">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
     
                <!--
                <Grid.Resources>
                    <my:EnumBooleanConverter x:Key="enumBooleanConverter"/>
                </Grid.Resources>
                -->
     
                <!-- HEADER -->
                <Border Grid.Row="0"
                        Background="{StaticResource HeaderBackground}">
                    <Label HorizontalAlignment="Center" 
                           Content="Server" 
                           FontSize="14" FontFamily="Georgia" FontWeight="Bold"/>
                </Border>
     
                <!-- Mode -->
                <Grid Grid.Row="1">
                    <View:ModeView x:Name="ModeView" />
                </Grid>
            </Grid>
        </Border>
    </UserControl>
    Construteur du view model A
    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
     
        public ServerViewModel(CommunicationManager com)
        {
          if (com == null)
            throw new NullReferenceException("com");
          //Initialize the communication manager
          _com = com;
     
          IsEnable = true;
     
          //*
          ModeViewModel modeViewModel = new ModeViewModel(2, _com);
     
          ModeView.DataContext = modeViewModel;
          //*/
        }
    C'est le "ModeView.DataContext = modeViewModel;" qui émet une erreur. J'aimerai dire à l'user control, de se binder avec le view modele que je viens d'instancier

  2. #2
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Quelle erreur tu as?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Par défaut
    Première chose que je vois, c'est que depuis le constructeur de ton ServerViewModel tu essaies d'affecter le DataContext de ton ModeView.

    Rassure moi, ton truc ne compile même pas ? c'est visual studio dans l'éditeur de code qui te met une erreur ? Parce que tu essaies d'affecter la propriété d'un objet et non pas l'instance d'un objet

    Si tu veux passer un DataContext d'une vue depuis une autre vue, il faut évidemment que cette action se fasse dans la vue.
    Sinon il faut que tu ais une application MVVM avec le principe des ViewMediator. Dans ce cas je me rappelle que Zeeshan Amjad avait fait une suite en 6 parties présentant la mise en place de ViewMediators: http://zamjad.wordpress.com/2012/01/...ntrols-part-1/

  4. #4
    Membre à l'essai
    Inscrit en
    Août 2012
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 4
    Par défaut
    Oui ça ne compilait pas.

    Merci pour le lien, je vais étudié cela.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Par défaut
    Si c'est pour une petite appli sans grosse architecture, c'est peut être un peu lourd/inutile de mettre en place les ViewMediators.
    Essaie déjà depuis ta vue parent, de refiler le ViewModel correspondant à ta vue enfant. Les Views connaissent nécessairement leurs ViewModel

  6. #6
    Membre à l'essai
    Inscrit en
    Août 2012
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 4
    Par défaut
    Ce que je voudrais, c'est avoir un UserControl, composé d'autre user contrôle. Tous les users contrôles gèrent des propriétés d'un même object de communication. Un user contrôle permettra de paramétrer le mode, tandis qu'un autre user contrôle permet de définir des options.

    Je voudrais binder les inputs des différents user contrôle au propriétés de mon object de communication.

    L'idée était que ma vue principale instancie un ViewModel avec paramètre pour chacune de mes vues enfants. Et me débrouiller pour affecter ces ViewModel crée au data context des vues enfants.

    Je ne sais pas si c'est la bonne façon de faire, je débute en MVVM. Je me retrouve avec le ViewModel de ma vue principale qui possède une propriétée pour chaque ViewModel qu'il créé pour que je puisse les récuperer et les affectés au data model de la vue appropriée.
    Ca fonctionne, mais je trouve pas ca très évolutif et ca me semble peu propre comme code.

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

Discussions similaires

  1. [Système] Problème de définition des variables
    Par SLAM JACK dans le forum Langage
    Réponses: 6
    Dernier message: 29/03/2006, 19h53
  2. [Configuration] Problème sur définition de constante
    Par Yobs dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 24/03/2006, 11h40
  3. Réponses: 1
    Dernier message: 21/12/2005, 19h08
  4. Réponses: 2
    Dernier message: 17/08/2005, 11h20
  5. Réponses: 22
    Dernier message: 05/07/2005, 00h04

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