2013-11-17 2 views
2

Я пытаюсь использовать AutoCompleteBox (находится в WPFToolkit) вместо обычного текстового поля внутри DataGridTemplateColumn, но, похоже, он не обновляет связанный источник.WPF AutoCompleteBox в проблемах редактирования DataGridTemplateColumn

Фактически, когда я изменяю текст и нажимаю Enter или выхожу за пределы ячейки, текст возвращается к исходному значению свойства.

Вот небольшое приложение WPF (Framework 4.0), который воспроизводит проблему
(требуется ссылка на следующие wpf toolkit сборками:
WPFToolkit.dll
System.Windows.Controls.Input.Toolkit.dll)

MainWindows.xaml:

<Window x:Class="WpfApplicationTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Input.Toolkit" 
     Title="MainWindow" Height="350" Width="525" 
     x:Name="wnd"> 
    <StackPanel> 
     <DataGrid ItemsSource="{Binding Path=Items, ElementName=wnd}" 
        AutoGenerateColumns="False"> 
      <DataGrid.Columns> 

       <DataGridTextColumn Header="Item (textcolumn)" Binding="{Binding Name}" /> 

       <DataGridTemplateColumn Header="Item (autocompletebox)" > 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <StackPanel> 
           <TextBlock Text="{Binding Name}"/> 
          </StackPanel> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
        <DataGridTemplateColumn.CellEditingTemplate> 
         <DataTemplate> 
          <StackPanel> 
           <controls:AutoCompleteBox 
            Text="{Binding Name}" 
            ItemsSource="{Binding Path=Hints, Source={x:Reference wnd}}" 
            Populating="ACBox_Populating" /> 
          </StackPanel> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellEditingTemplate> 
       </DataGridTemplateColumn> 

      </DataGrid.Columns> 
     </DataGrid> 
    </StackPanel> 
</Window> 

MainWindow.xaml.cs

public partial class MainWindow : Window 
{ 
    public class Item 
    { 
     public string Name { get; set; } 
    } 

    public MainWindow() 
    { 
     this.Hints = new ObservableCollection<string>(); 
     this.Items = new Item[]{ new Item{ Name = "a" }, new Item{ Name = "b" }}; 
     InitializeComponent(); 
    } 

    public Item[] Items { get; set; } 

    public ObservableCollection<string> Hints { get; set; } 

    private void ACBox_Populating(object sender, PopulatingEventArgs e) 
    { 
     // generate 10 fake suggestions... 
     this.Hints.Clear(); 
     for (int i = 0; i < 10; i++) 
      this.Hints.Add(e.Parameter + "_" + i); 
    } 
} 

Любая идея?

ответ

2

Поведение DataGrid по умолчанию для привязки - UpdateSourceTrigger = LostFocus изменит его на PropertyChanged.

  <controls:AutoCompleteBox 
       Text="{Binding Name, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" 
       ItemsSource="{Binding Path=Hints, Source={x:Reference wnd}}" 
       Populating="ACBox_Populating" /> 
+0

Я уже пробовал, но он не работает либо ... :( – digEmAll

+0

как насчет Mode = «TwoWay»? –

+0

Да, это работает! Я думал TwoWay был по умолчанию ... в любом случае благодарственные годов много :) – digEmAll

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