2010-08-30 3 views
5

Perché il databinding TwoWay non funziona sulla proprietà text di un combobx in .net 4.0 (funziona in .net 3.5)?Perché il databinding TwoWay non funziona sulla proprietà text di un combobx in .net 4.0?

Il mio codice:

ho un file XML in questo modo:

<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> 

e ho un controllo ListItem del genere:

<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> 

Ecco il codice dietro:

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"); 
} 

faccio così perché posso avere un ComboBox con auto-completamento con l'opzione différents personalizzato per ciascuno, ma posso scrivere quello che voglio, e il risultato è nell'opzione attributo dell'elemento <combobox>

E funzionano bene se obiettivo .net 3.5, ma solo binding di textbox se destinazione .net 4.0

Perché? Cosa posso fare?

Grazie per l'aiuto!

+0

Non riesco a farlo funzionare. È possibile correggere il codice di esempio? Si prega di creare una nuova applicazione WPF, copiare e incollare il codice di esempio in quel nuovo progetto e provare ad eseguirlo. Ho completato questi passaggi e non sono riuscito a ottenere contenuti nella casella di riepilogo. –

risposta

1

Coucou, soluzione j'ai trouvé une versare 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 sicuri d'avoir bien compris pourquoi un tel changement entre le framework 3.5 dans lequel ça marchait bien, et le 4,0 ...

Ecco la soluzione per fare questo codice si lavora con framework 4.0 (ho cercato di adattarlo al vostro exemple, ma non sono sicuro In ogni caso, questa è l'idea.):

Cambia il tuo controllo ListItem così:

<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> 

E il nuovo codice è dietro:

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; 
    } 
} 

Per capire, dare un'occhiata a:

J'espère vraiment que ça marchera versare toi aussi, n'hésite mi sono demander si besoins!

+0

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

+0

inglese per favore. La maggior parte delle persone su SO non lancia il francese e la sua risposta non è solo per il PO; è per tutti –

+1

Per 2 mesi, tutti tranne noi due sembravano interessati a questo problema e c'è una discussione su Area 51 per uno Stack Overflow francese (http://sl.qyy.fr/frso) in cui qualcuno ha detto "I don" Ecco perché non possono fare le loro domande su StackOverflow. Non esiste una regola che dica solo l'inglese "". Ad ogni modo, mi prendo cura che tutte le parti importanti della mia risposta siano in inglese, e cosa ha detto Service Informatique nel suo commento: "Lo proverò appena posso, grazie mille ^^". Quindi, non c'è nulla di importante in francese, non ti preoccupare ^^ (ma se vuoi controllarlo: http://translate.google.fr/) –

1

Per il momento, l'unica vera soluzione che ho trovato a questo problema è quello di non colpire Framework 4.0 ma Framework 3.5 ...

+0

Ok, la taglia è per la tua domanda, sembra non interessare nessuno ... –