2010-05-28 4 views
14

Я использую datagrid из wpf 4.0. У этого есть TemplateColumn, содержащий флажок. Свойство IsChecked этого флажка устанавливается посредством привязки.wpf 4.0 datagrid шаблон столбца проблема двустороннего связывания

Проблема в том, что даже если я укажу режим привязки явно как TwoWay, он работает только в одном направлении.

Я должен упомянуть, что тот же код отлично работает в .net 3.5 с datagrid из инструментария wpf.

Пожалуйста, взгляните на содержимое .xaml и .cs.

Спасибо заранее,

Roland

<Window.Resources> 
    <DataTemplate 
     x:Key="IsSelectedColumnTemplate"> 
     <CheckBox 
      IsChecked="{Binding Path=IsSelected, Mode=TwoWay}" 
      /> 
    </DataTemplate> 
</Window.Resources> 
<Grid> 
    <DataGrid 
     x:Name="dataGrid" 
     AutoGenerateColumns="false" 
     CanUserAddRows="False" 
     CanUserDeleteRows="False" 
     HeadersVisibility="Column" 
     ItemsSource="{Binding}" 
     > 
     <DataGrid.Columns> 
      <DataGridTemplateColumn 
       Header="Preselected" 
       x:Name="myIsSelectedColumn" 
       CellTemplate="{StaticResource IsSelectedColumnTemplate}" 
       CanUserSort="True" 
       SortMemberPath="Orientation" 
       Width="Auto" 
       /> 
     </DataGrid.Columns> 
    </DataGrid> 
</Grid> 

и соответствующий контент .cs:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     ObservableCollection<DataObject> DataSource = new ObservableCollection<DataObject>(); 
     DataSource.Add(new DataObject());  
     DataSource.Add(new DataObject());   
     dataGrid.ItemsSource = DataSource; 
    } 
} 

public class DataObject : DependencyObject 
{ 
    public bool IsSelected 
    { 
     get { return (bool)GetValue(IsSelectedProperty); } 
     set { SetValue(IsSelectedProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for IsSelected. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty IsSelectedProperty = 
     DependencyProperty.Register("IsSelected", typeof(bool), typeof(DataObject), new UIPropertyMetadata(false, OnIsSelectedChanged)); 

    private static void OnIsSelectedChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) 
    { 
     // this part is not reached 
    } 
} 

ответ

34

Вы устанавливаете UpdateSourceTrigger = PropertyChanged в вашем Checkbox IsChecked связывание в DataTemplate: <CheckBox IsChecked="{Binding Path=IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

+0

Это работает отлично, но это работает не так, как ожидалось. Когда вы вводите одну букву, она сразу меняет объект. Что произойдет, если у вас есть триггер, который запускает обработчик проверки. это означает, что он срабатывает 1000 раз, если вы наберете 1000 символов? Это неправильно. – Dilshod

+1

Это может быть приемлемое решение, отслеживающее событие LostFocus. Vincent

+0

@Dilshod, что вы подразумеваете под этим, будет срабатывать 1000 раз, если вы наберете 1000 символов? мы говорим о флажке, верно? –

5

Вот сделка, как сетка данных работает, является то, что он создает просмотра данных и отображает его вместо исходных данных, поэтому, когда вы просто привязываете свойство в CellTemplate, оно не распространяется с представления на данные.

Что вам нужно сделать, это использовать CellEditingTemplate так, чтобы сеть данных знала, когда вы редактируете, и может распространять ее на данные по завершении (или она может отменить ее, если вы отмените ее).

Вот модифицированный XAML для вас:

<Window.Resources> 
    <DataTemplate x:Key="IsSelectedColumnTemplate"> 
     <TextBlock Text="{Binding IsSelected}"/> 
    </DataTemplate> 
    <DataTemplate x:Key="IsSelectedColumnTemplateEditing"> 
     <CheckBox IsChecked="{Binding Path=IsSelected, Mode=TwoWay}"/> 
    </DataTemplate> 
</Window.Resources> 

... 
<DataGridTemplateColumn 
    Header="Preselected" 
    x:Name="myIsSelectedColumn" 
    CellTemplate="{StaticResource IsSelectedColumnTemplate}" 
    CellEditingTemplate="{StaticResource IsSelectedColumnTemplateEditing}" 
    CanUserSort="True" 
    Width="Auto" 
/> 
... 
+3

Я не думаю, что это правда. Он отлично работает для меня без CellEditingTemplate, используя ответ Sese. CellEditingTemplate выглядит так, что это будет затруднять работу и затрудняет работу пользователя. Конечно, для этого флажка требуется более одного щелчка. – MikeKulls