Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

WPF - ObjectDataProvider

1 réponse
Avatar
Clark [MVP CRM]
Bonjour

J'ai un problème dans un développement WPF.
Dans un usercontrol, je déclare dans la section resources, un
objectdataprovider :

<!--Source pour la combobox Gérants-->
<ObjectDataProvider x:Key="GerantsValues" MethodName="GetGerants"
ObjectType="{x:Type BLL:CompteManager}"/>

Celui-ci pointe sur une méthode static dans un autre projet :

public static IEnumerable<ConsoPTF.Gerant> GetGerants()
{
if (db == null)
db = new ConsoPTFDataContext(ConnectionString);
return( from g in db.Gerants
select g);
}

Le dataContext est initialisé avec une variable static "ConnectionString"
chargée au lancement de l'application.
Toutes mes classes proviennent d'un fichier dbml créé à partir de ma base
SQL Server, donc Linq to SQL

Dans mon usercontrol j'affiche une Combobox placée dans un Grid dont le
datacontext est bindé à une instance de ma classe Compte

<Grid Grid.Row="0" Name="CompteGrid" DataContext="{Binding
ElementName=compte}">
....
<ComboBox Name="GerantsComboBox"
ItemsSource="{Binding Source={StaticResource
GerantsValues}}"
DisplayMemberPath="ClasserSous"
SelectedValuePath="CodeBIP"
SelectedValue="{Binding Path=CodeGerant}" />
...

Lorsque je lance l'application et que j'ouvre un compte, ma combobox
m'affiche bien la valeur "ClasserSous" correspond à la propriété de ma
classe compte CodeGerant (l'équivalent de CodeBIP dans ma classe Gerants)
mais dans le designer j'ai toujours cette erreur :

Error 1 Value cannot be null.
Parameter name: fileOrServerOrConnection C:\Users\gbl\Documents\Visual
Studio
2008\Projects\AURISGestion\AURISGestion.WPFUI\UserControls\ucCompte.xaml 165
9 AURISGestion.WPFUI

Je pense que ça a un rapport avec la façon dont j'instancie mon datacontext
mais je ne vois pas où je me trompe...

De plus, dans mon usercontrol, j'intercepte l'événement
this.compte.PropertyChanged += new
PropertyChangedEventHandler(compte_PropertyChanged);
afin de savoir si une propriété a été modifiée et dans ce cas proposer
l'enregistrement à la fermeture. Ca fonctionne pour toutes les propriétés
sauf pour celles bindées à des combobox (j'en ai plusieurs comme l'exemple
ci-dessus et toutes ont la même erreur).
Je ne sais pas si c'est liée ou si c'est un autre problème mais je sèche.

Merci d'avance.
--
Cordialement
Clark
Mon nouveau blog : http://blogs.codes-sources.com/clark

1 réponse

Avatar
Clark [MVP CRM]
Bonjour
J'ai contourné finalement mon problème de cette façon
Je crée mon ObjectDataProvider de cette façon :
<ObjectDataProvider x:Key="GerantsValues"/>
Et je l'instancie dans le constructeur du UserControl :
ObjectDataProvider odpGerants =
this.FindResource("GerantsValues") as ObjectDataProvider;
if (odpGerants != null) odpGerants.ObjectInstance =
CompteManager.GetGerants();
Pas très satisfaisant mais au moins je n'ai plus le bug d'affichage...
Pour l'évenement propertychanged qui n'était pas levé par un changement de
valeur de la combobox, il manquait bêtement Mode=TwoWay dans le Binding :
<ComboBox Name="GerantsComboBox" Width="150"
ItemsSource="{Binding Source={StaticResource
GerantsValues}}"
DisplayMemberPath="ClasserSous"
SelectedValuePath="CodeBIP"
SelectedValue="{Binding Path=CodeGerant,
Mode=TwoWay}" />

--
Cordialement
Clark
Mon nouveau blog : http://blogs.codes-sources.com/clark


"Clark [MVP CRM]" a écrit dans le message de
news:
Bonjour

J'ai un problème dans un développement WPF.
Dans un usercontrol, je déclare dans la section resources, un
objectdataprovider :

<!--Source pour la combobox Gérants-->
<ObjectDataProvider x:Key="GerantsValues" MethodName="GetGerants"
ObjectType="{x:Type BLL:CompteManager}"/>

Celui-ci pointe sur une méthode static dans un autre projet :

public static IEnumerable<ConsoPTF.Gerant> GetGerants()
{
if (db == null)
db = new ConsoPTFDataContext(ConnectionString);
return( from g in db.Gerants
select g);
}

Le dataContext est initialisé avec une variable static "ConnectionString"
chargée au lancement de l'application.
Toutes mes classes proviennent d'un fichier dbml créé à partir de ma base
SQL Server, donc Linq to SQL

Dans mon usercontrol j'affiche une Combobox placée dans un Grid dont le
datacontext est bindé à une instance de ma classe Compte

<Grid Grid.Row="0" Name="CompteGrid" DataContext="{Binding
ElementName=compte}">
....
<ComboBox Name="GerantsComboBox"
ItemsSource="{Binding Source={StaticResource
GerantsValues}}"
DisplayMemberPath="ClasserSous"
SelectedValuePath="CodeBIP"
SelectedValue="{Binding Path=CodeGerant}" />
...

Lorsque je lance l'application et que j'ouvre un compte, ma combobox
m'affiche bien la valeur "ClasserSous" correspond à la propriété de ma
classe compte CodeGerant (l'équivalent de CodeBIP dans ma classe Gerants)
mais dans le designer j'ai toujours cette erreur :

Error 1 Value cannot be null.
Parameter name: fileOrServerOrConnection C:UsersgblDocumentsVisual
Studio
2008ProjectsAURISGestionAURISGestion.WPFUIUserControlsucCompte.xaml
165 9 AURISGestion.WPFUI

Je pense que ça a un rapport avec la façon dont j'instancie mon
datacontext mais je ne vois pas où je me trompe...

De plus, dans mon usercontrol, j'intercepte l'événement
this.compte.PropertyChanged += new
PropertyChangedEventHandler(compte_PropertyChanged);
afin de savoir si une propriété a été modifiée et dans ce cas proposer
l'enregistrement à la fermeture. Ca fonctionne pour toutes les propriétés
sauf pour celles bindées à des combobox (j'en ai plusieurs comme l'exemple
ci-dessus et toutes ont la même erreur).
Je ne sais pas si c'est liée ou si c'est un autre problème mais je sèche.

Merci d'avance.
--
Cordialement
Clark
Mon nouveau blog : http://blogs.codes-sources.com/clark