Почему привязка данных TwoWay не работает со свойством text в выпадающем списке в .net 4.0 - PullRequest
5 голосов
/ 30 августа 2010

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

Мой код:

У меня есть 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

Почему? Что я могу сделать?

Ответы [ 2 ]

1 голос
/ 06 ноября 2010

Coucou, J'ai Trouvé N решение для проблемы (в том числе, марш для меня)!Dit moi si ça marche pour toi aussi, mais y'a pas de raison ^^.

Par contre, je ne suis pas sure d'avoir bien, включает в себя изменения и изменения в действииframework 3.5, danc lequel, marchait bien, et le 4.0 ...

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

Измените свой 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 que ça marchera pour toi aussi, n'hésite pas à me demander si besoins!

1 голос
/ 01 ноября 2010

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

...