2010-08-30 10 views
5

Pourquoi la liaison de données TwoWay ne fonctionne pas sur la propriété text d'un combobx dans .net 4.0 (cela fonctionne dans .net 3.5)?Pourquoi la liaison de données TwoWay ne fonctionne pas sur la propriété text d'un combobx dans .net 4.0?

Mon code:

J'ai un fichier xml comme ceci:

<xml> 

    <combobox option="" obs="tralala"> 
    <option value="here" /> 
    <option value="there" /> 
    </combobox> 

    <combobox option="blue" obs=""> 
    <option value="one" /> 
    <option value="two" /> 
    <option value="three" /> 
    </combobox> 

</xml> 

et j'ai un contrôle ListItem comme ça:

<ListBox DataContext="{Binding UpdateSourceTrigger=PropertyChanged}" 
     ItemsSource="{Binding UpdateSourceTrigger=PropertyChanged}" 
     IsSynchronizedWithCurrentItem="True"> 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <DockPanel LastChildFill="True"> 
     <ComboBox MinWidth="75" IsEditable="True" 
        IsReadOnly="False" DockPanel.Dock="Left" 
        DataContext="{Binding Path=Element[combobox ]}" 
        IsSynchronizedWithCurrentItem="False" 
        ItemsSource="{Binding Path=Elements[option], UpdateSourceTrigger=PropertyChanged}" 
        DisplayMemberPath="Attribute[value].Value" 
        Text="{Binding Path=Attribute[option].Value, UpdateSourceTrigger=PropertyChanged}" 
        /> 
     <TextBox MinWidth="150" AcceptsReturn="False" 
       AcceptsTab="False" TextWrapping="NoWrap" 
       Text="{Binding Path=Attribute[obs].Value, UpdateSourceTrigger=PropertyChanged}" /> 
     </DockPanel> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Voici le code derrière:

XDocument xdXml; 

public MyWindow() 
{ 

    xdXml = XDocument.Load(@"C:\file.xml"); 

    InitializeComponent(); 

    DataContext = xdXml; 

    xdXml.Changed += new EventHandler<XObjectChangeEventArgs>(XdXml_Changed); 
} 


private void XdXml_Changed(object sender, XObjectChangeEventArgs e) 
{ 
    xdXml.Save(@"C:\fichier.xml"); 
} 

-je faire comme ça parce que je peux avoir un ComboBox avec auto-complétion avec l'option personnalisée Différents pour chacun, mais je peux écrire ce que je veux, et le résultat est dans l'option d'attribut de l'élément <combobox>

Il fonctionne bien si je cible .net 3.5, mais que la zone de texte est liée si je cible .net 4.0

Pourquoi? Que puis-je faire?

Merci d'avance pour votre aide!

+0

Je n'arrive pas à faire marcher ça. Est-il possible que vous corrigiez votre exemple de code? Veuillez créer une nouvelle application WPF, copiez et collez votre exemple de code dans ce nouveau projet et essayez de l'exécuter. J'ai terminé ces étapes et je n'ai pas réussi à insérer le contenu dans la liste. –

Répondre

1

Coucou, solution J'ai trouvé juin Pour notre Problème (En tout cas, ça marche pour moi)! Dit moi si ça marche pour toi aussi, mais y'a pas de raison ^^.

Par contre, je ne suis pas sûr d'bien Avoir un tel compris Pourquoi le cadre Entre changement 3.5 Dans bien Lequel ça marchait, et le 4.0 ...

Voici la solution pour faire ce code de travail avec le cadre 4.0 (j'ai essayé de l'adapter à votre exemple, mais je ne suis pas sûr Quoi qu'il en soit, c'est l'idée.):

Changer votre contrôle ListItem comme ça:

<ListBox DataContext="{Binding UpdateSourceTrigger=PropertyChanged}" 
     ItemsSource="{Binding UpdateSourceTrigger=PropertyChanged}" 
     IsSynchronizedWithCurrentItem="True"> 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <DockPanel LastChildFill="True"> 
     <!-- Add this collapsed textbox --> 
     <TextBox Visibility="Collapsed" DataContext="{Binding Path=Element[combobox]}" Text="{Binding Path=Text, ElementName=cbxComboBox, UpdateSourceTrigger=PropertyChanged}" TextChanged="TextBox_TextChanged" /> 
     <!-- Name the Combobox --> 
     <ComboBox Name="cbxComboBox" MinWidth="75" IsEditable="True" 
        IsReadOnly="False" DockPanel.Dock="Left" 
        DataContext="{Binding Path=Element[combobox]}" 
        IsSynchronizedWithCurrentItem="False" 
        ItemsSource="{Binding Path=Elements[option], UpdateSourceTrigger=PropertyChanged}" 
        DisplayMemberPath="Attribute[value].Value" 
        Text="{Binding Path=Attribute[option].Value, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" 
        /> 
     <TextBox MinWidth="150" AcceptsReturn="False" 
       AcceptsTab="False" TextWrapping="NoWrap" 
       Text="{Binding Path=Attribute[obs].Value, UpdateSourceTrigger=PropertyChanged}" /> 
     </DockPanel> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Et votre nouveau code se cache derrière:

XDocument xdXml; 

public MyWindow() 
{ 

    xdXml = XDocument.Load(@"C:\file.xml"); 

    InitializeComponent(); 

    DataContext = xdXml; 

    xdXml.Changed += new EventHandler<XObjectChangeEventArgs>(XdXml_Changed); 
} 


private void XdXml_Changed(object sender, XObjectChangeEventArgs e) 
{ 
    xdXml.Save(@"C:\fichier.xml"); 
} 

// finally, add this event: 
private void TextBox_TextChanged(object sender, TextChangedEventArgs e) 
{ 
    if (((XElement)((FrameworkElement)sender).DataContext).Attribute("option").Value != ((TextBox)sender).Text) 
    { 
     ((XElement)((FrameworkElement)sender).DataContext).Attribute("option").Value = ((TextBox)sender).Text; 
    } 
} 

Pour comprendre, jetez un oeil à:

Je espère que ça marchera vraiment verser toi aussi, n'hésite pas à me demander si besoin!

+0

Je vais tester ça à l'ocasion, merci beaucoup ^^ –

+0

Anglais s'il vous plaît. La plupart des gens ne parlent pas français et votre réponse n'est pas seulement pour le PO; c'est pour tout le monde. –

+1

Pendant 2 mois, n'importe qui excepté nous deux a semblé intéressé par cette question et il y a une discussion sur la zone 51 pour un débordement français de pile (http://sl.qyy.fr/frso) où quelqu'un a dit '' je ne fais pas ' Je ne vois pas pourquoi ils ne peuvent pas poser leurs questions sur StackOverflow.Il n'y a pas de règle qui dit anglais seulement "'. En tout cas, je veille à ce que toutes les parties importantes de ma réponse soient en anglais, et ce que Service Informatique a dit dans son commentaire est: "Je vais le tester dès que possible, merci beaucoup ^^". Donc, il n'y a rien d'important en français, ne vous inquiétez pas ^^ (mais si vous voulez le vérifier: http://translate.google.fr/) –

1

Pour le moment, la seule solution que j'ai trouvé à ce problème est de cibler non Framework 4.0 mais Framework 3.5 ...

+0

Ok, la prime est pour votre question, il semble n'intéresser personne ... –