2010-08-30 5 views
5

Warum Databinding TwoWay nicht mit der Texteigenschaft eines combobx in .net 4.0 arbeiten (es funktioniert in .net 3.5)?Warum Databinding TwoWay nicht mit der Texteigenschaft eines combobx in .net 4.0 arbeiten?

Mein Code:

ich eine XML-Datei wie folgt aussehen:

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

und ich habe eine ListItem Kontrolle wie folgt aus:

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

Hier ist der Code hinter:

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

Ich mag das tun, weil ich ein ComboBox mit Auto-Vervollständigung mit der différents benutzerdefinierten Option für jeden haben kann, aber ich kann schreiben, was ich will, und das Ergebnis ist in dem Attribute Option des Elements <combobox>

Es funktioniert wenn ich ziele .net 3.5, aber nur textbox binden wenn ich ziele .net 4.0

Warum? Was kann ich tun?

Vielen Dank für Ihre Hilfe!

+0

Ich kann nicht scheinen, dass dies funktioniert. Ist es möglich, dass Sie Ihr Codebeispiel korrigieren? Erstellen Sie eine neue WPF-Anwendung, kopieren und fügen Sie Ihren Beispielcode in das neue Projekt ein und versuchen Sie, es auszuführen. Ich habe diese Schritte ausgeführt und konnte keine Inhalte in die Listbox bringen. –

Antwort

1

Coucou, j'ai trouvé une Lösung gießt notre problème (en tout cas Ziel, ça marche pour moi)! Dit moi si ça marche pour toi aussi, más y'a pas de raison ^^.

Par contre, je ne suis pas sicher d'avoir bien compris pourquoi un tel entre le changement framework 3.5 dans lequel ça marchait bien et le 4.0 ...

Hier ist die Lösung für das Tun dieser Code mit Rahmen arbeiten 4.0 (ich habe versucht, es zu Ihrem exemple anzupassen, aber ich bin nicht sicher, wie auch immer, dies ist die Idee.):

ändern ListItem Steuerung wie folgt aus:

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

Und hinter den neuen Code ist:

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

Für verstehen, werfen Sie einen Blick auf:

J'espère vraiment que ça marchera gießen toi aussi, n'hésite pas à me nachfrage und besoins!

+0

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

+0

Englisch bitte. Die meisten Leute auf SO sprechen kein Französisch und Ihre Antwort ist nicht nur für das OP; es ist für alle da. –

+1

Für 2 Monate schien jemand außer uns beiden an diesem Thema interessiert zu sein und es gibt eine Diskussion über Area 51 für einen französischen Stack Overflow (http://sl.qyy.fr/frso), wo jemand sagte "Ich weiß nicht" Warum kann man nicht seine Fragen zu StackOverflow stellen? Es gibt keine Regel, die Englisch Only "' sagt. Wie auch immer, ich sorge dafür, dass alle wichtigen Teile meiner Antwort auf Englisch sind, und was Service Informatique in seinem Kommentar sagte: "Ich werde es so schnell wie möglich testen, vielen Dank ^^". Also, es gibt nichts Wichtiges in Französisch, keine Sorge ^^ (aber wenn Sie es überprüfen möchten: http://translate.google.fr/) –

1

Für den Moment ist die einzige wirkliche Lösung, die ich für dieses Problem wurde nicht gefunden Framework 4.0 aber Framework 3.5 ...

+0

Ok, Kopfgeld ist für Ihre Frage, es scheint niemanden zu interessieren ... –

Verwandte Themen