2010-08-30 7 views
5

¿Por qué la vinculación de datos TwoWay no funciona en la propiedad de texto de un combobx en .NET 4.0 (está funcionando en .net 3.5)?¿Por qué la vinculación de datos TwoWay no funciona en la propiedad de texto de un combobx en .net 4.0?

Mi código:

tengo un archivo XML como esto:

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

y tengo un control ListItem así:

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

Aquí está el código detrás:

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

hago así porque puedo tener un ComboBox con auto-completado con la opción personalizada différents para cada uno, pero puedo escribir lo que quiero, y el resultado es en la opción de atributo del elemento <combobox>

que funcione bien si me dirijo a .net 3.5, pero solo se vincula a textbox si apunto .net 4.0

¿Por qué? ¿Qué puedo hacer?

¡Gracias de antemano por su ayuda!

+0

Parece que no puedo hacer que esto funcione. ¿Es posible que corrija su muestra de código? Cree una nueva aplicación WPF, copie y pegue su código de muestra en ese nuevo proyecto e intente ejecutarlo. Completé estos pasos y no pude obtener los contenidos en el cuadro de lista. –

Respuesta

1

Coucou, solución j'ai trouvé une verter problème Notre (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 d'avoir Seguro busque compris pourquoi changement ONU tel Entre le marco 3.5 dans lequel ça marchait busque, et le ... 4.0

Aquí está la solución para hacer el código de trabajo con el marco 4.0 (he tratado de adaptarlo a su exemple, pero no estoy seguro de todos modos, esta es la idea.):

Cambiar tu control ListItem así:

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

Y su nuevo código subyacente es:

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

Para entender, echar un vistazo a:

J'espère vraiment que ça marchera verter toi aussi, n'hésite pas à me demander si besoins!

+0

Je vais à l'probador ça OCASION, merci beaucoup ^^ –

+0

Inglés por favor. La mayoría de la gente en SO no lanza francés y tu respuesta no es solo para OP; es para todos Para –

+1

2 meses, nadie excepto los dos de nosotros parecía interesado en este tema y hay una discusión sobre el Área 51 para un desbordamiento de pila Francés (http://sl.qyy.fr/frso) donde alguien dijo '" I don' T ver por qué no pueden hacer sus preguntas en StackOverflow. No hay ninguna regla que diga "Sólo inglés". De todos modos, me ocupo de que todas las partes importantes de mi respuesta estén en inglés, y lo que Service Informatique dijo en su comentario es: '' Lo probaré tan pronto como pueda, muchas gracias ^^ "'. Por lo tanto, no hay nada importante en francés, no se preocupe ^^ (pero si quieres comprobarlo: http://translate.google.fr/) –

1

Por el momento, la única solución real que encontré a este problema es no apuntar Framework 4.0 pero Framework 3.5 ...

+0

Ok, generosidad es para su pregunta, parece interesar a nadie ... –

Cuestiones relacionadas