2010-08-30 2 views
5

Почему привязка данных TwoWay не работает над текстовым свойством combobx в .net 4.0 (он работает в .net 3.5)?Почему привязка данных TwoWay не работает с текстовым свойством combobx в .net 4.0?

Мой код:

У меня есть файл XML, как это:

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

и у меня есть ListItem контроль подобное:

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

Вот код позади:

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

я так потому, что я могу иметь ComboBox с автозаполнением с дифферентом на заказ вариантом для каждого, но я могу писать то, что я хочу, и результат в параметре атрибута элемента <combobox>

Он отлично работает если я нацелен на .net 3.5, но только привязку текстового поля, если я нацелен .net 4.0

Почему? Что мне делать?

Спасибо вам за помощь за помощь!

+0

Я не могу заставить это работать. Возможно ли исправить ваш образец кода? Создайте новое приложение WPF, скопируйте и вставьте код примера в этот новый проект и попробуйте запустить его. Я выполнил эти шаги и не смог получить содержимое в списке. –

ответ

1

Coucou, j'ai Trouvé ипе раствор вылить Notre problème (еп зазывают саз, ça marche pour moi)! Dit moi si ça marche pour toi aussi, mais y'a pas de raison ^^.

Par Contre, JE пе суис па уверен d'Avoir Бен КОМПРИС Pourquoi ип тел changement Entre ля рамка 3,5 данс lequel ça marchait Ыеп, и др ль 4,0 ...

Вот решение для выполнения этот код работает с Framework 4.0 (я пытался адаптировать его к Exemple, но я не уверен Во всяком случае, это идея.):

Изменение ListItem управления так:

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

И ваш новый код за это:

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

Для понимания, обратите внимание на:

J'espère vraiment дие ça marchera налить toi aussi, n'hésite pas à me demander si besoins!

+0

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

+0

Russian please. Большинство людей на SO не копят французы, и ваш ответ не только для OP; это для всех. –

+1

В течение 2-х месяцев никто, кроме нас обоих, не интересовался этой проблемой, и есть дискуссия о Районе 51 для переполнения французского стека (http://sl.qyy.fr/frso), где кто-то сказал «Я не знаю», почему они не могут задавать свои вопросы по StackOverflow. Нет правила, которое говорит только на английском языке. Во всяком случае, я позабочусь о том, чтобы все важные части моего ответа были на английском языке, и то, что Service Informatique в своем комментарии: «Я испытаю это, как только смогу, большое спасибо ^^». Итак, на французском языке нет ничего важного, не волнуйтесь ^^ (но если вы хотите проверить это: http://translate.google.fr/) –

1

На данный момент, единственное реальное решение я нашел на эту проблему, чтобы не предназначаться Framework 4.0, но Framework 3.5 ...

+0

Хорошо, щедрость для вашего вопроса, кажется, никого не интересует ... –

Смежные вопросы