Après avoir lutté pendant environ une semaine avec un problème dans Silverlight 4 + MVVM-Light boîte à outils et après avoir cherché sur le web sans succès, je veux présenter mon problème ici et j'espère que quelqu'un pourrait donner moi quelques indices.Problème avec DataBinding une ComboBox dans Silverlight avec MVVM Light
Je veux présenter le Programme simplifié:
Mes classes de modèle:
Personne
public class Personne { décimal privé _cod_Person;
public decimal Cod_Person { get { return _cod_Person; } set { _cod_Person = value; } } private string _des_Person; public string Des_Person { get { return _des_Person; } set { _des_Person = value; } }
}
personinfo
public class personinfo { décimal privé _cod_person;
public decimal Cod_person { get { return _cod_person; } set { _cod_person = value; } } private string _des_note; public string Des_note { get { return _des_note; } set { _des_note = value; } }
}
Voici mon ViewModel:
public class PersonViewModel : ViewModelBase
{
public RelayCommand<Model.PersonInfo> save_Click { get; private set; }
public PersonViewModel()
{
save_Click = new RelayCommand<Model.PersonInfo>(personInfo =>
{
SavePerson(personInfo);
});
//the content of the combo box is defined
AllPerson = new ObservableCollection<Model.Person>
{
new Model.Person(){
Cod_Person = 1,
Des_Person = "Name 1"
},
new Model.Person(){
Cod_Person = 2,
Des_Person = "Name 2"
}
};
//an empty PersonInfo is created, which the UI will work on
ChoosenPerson = new Model.PersonInfo();
}
private void SavePerson(Model.PersonInfo personInfo)
{
//here some safing processing could be done...
//but is omitted here
//and here a new PersonInfo is assigned the ChoosenPerson
ChoosenPerson = new Model.PersonInfo();
}
public const string AllPersonPropertyName = "AllPerson";
private ObservableCollection<Model.Person> _allPersons = null;
public ObservableCollection<Model.Person> AllPerson
{
get
{
return _allPersons;
}
set
{
if (_allPersons == value)
{
return;
}
var oldValue = _allPersons;
_allPersons = value;
RaisePropertyChanged(AllPersonPropertyName, oldValue, value, true);
}
}
public const string ChoosenPersonPropertyName = "ChoosenPerson";
private Model.PersonInfo _choosenPerson = null;
public Model.PersonInfo ChoosenPerson
{
get
{
return _choosenPerson;
}
set
{
if (_choosenPerson == value)
{
return;
}
var oldValue = _choosenPerson;
_choosenPerson = value;
// Update bindings and broadcast change using GalaSoft.MvvmLight.Messenging
RaisePropertyChanged(ChoosenPersonPropertyName, oldValue, value, true);
}
}
}
À mon avis (PersonView) J'ai une zone de liste déroulante, une zone de texte et un bouton:
<UserControl x:Class="TEST_STACKOVERFLOW.PersonView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
DataContext="{Binding Source={StaticResource Locator}, Path=PersonViewModel.ChoosenPerson}" d:DesignHeight="258" d:DesignWidth="341">
<Grid>
<ComboBox Height="23" HorizontalAlignment="Left" Margin="84,51,0,0" Name="comboBox1" VerticalAlignment="Top" Width="120" ItemsSource="{Binding Source={StaticResource Locator}, Path=PersonViewModel.AllPerson}" DisplayMemberPath="Des_Person" SelectedValuePath="Cod_Person" SelectedValue="{Binding Path=Cod_person, Mode=TwoWay}" />
<Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="159,199,0,0" Name="button1" VerticalAlignment="Top" Width="75" Command="{Binding Source={StaticResource Locator}, Path=PersonViewModel.save_Click}" CommandParameter="{Binding}" />
<TextBox Height="23" HorizontalAlignment="Left" Margin="94,107,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" Text="{Binding Path=Des_note, Mode=TwoWay}" />
</Grid>
Lorsque le bouton est cliqué la première fois que tout fonctionne. Le paramètre (PersonInfo) passé après le clic sur le bouton contient la valeur ComboBox sélectionnée (Cod_person) et le texte inséré (Des_note). Dans la méthode SavePerson, une nouvelle instance PersonInfo est affectée à l'objet ChoosenPerson. Le problème se produit lorsque je clique sur le bouton une deuxième fois. Ensuite, en tant que paramètre après avoir cliqué sur le bouton, j'obtiens une instance de la classe PersonInfo qui contient le texte inséré correct dans la zone de texte mais comme valeur sélectionnée dans la liste déroulante, j'obtiens toujours , indépendamment de ce que j'ai choisi dans la zone de liste déroulante . Ce problème se produit juste dans le cas, que j'utilise en tant qu'instances d'éléments de zone de liste déroulante d'une classe. Si j'utilise comme éléments de liste déroulante uniquement des valeurs de chaîne, ce problème ne se produit pas. Mais je dois utiliser des instances d'une classe dans ma zone de liste déroulante.
J'espère que quelqu'un a un indice. Merci!
PS:
Intéressant est encore le fait que lors du changement de l'affectation du ChoosenPerson de "ChoosenPerson = new Model.PersonInfo();" à _choosenPerson = new Model.PersonInfo(); cela signifie par affectation par l'utilisation de membres privés au lieu de méthodes d'accès, la deuxième fois que le bouton est cliqué, les valeurs sont écrites dans le paramètre du bouton correctement. La seule chose est que les valeurs qui ont été insérées la dernière fois ne sont pas supprimées. Ils sont affichés après le premier clic sur le bouton. Mais ils ne sont pas affichés lorsque l'attribution d'un nouveau ChoosenPerson vide est faite par des méthodes d'accès ... Je ne peux pas expliquer ce comportement. Qui peut m'aider?? Je vous remercie.
Merci Maintenant, tout fonctionne, le problème était en partie lié à DataBinding d'une part, et d'autre part à mes Classes, qui remplissaient le ComboBox doit implémenter l'interface IEquatable .... – WillCoer