2010-05-28 3 views
14

J'utilise le DataGrid de wpf 4.0. Cela a un TemplateColumn contenant une case à cocher. La propriété IsChecked de la case à cocher est définie via la liaison.wpf 4.0 problème de liaison bidirectionnelle de colonne de modèle de données de données

Le problème est que même si je spécifie explicitement que le mode de liaison est TwoWay, cela ne fonctionne que dans un seul sens.

Je dois mentionner que le même code fonctionne parfaitement dans .net 3.5 avec le DataGrid de la boîte à outils wpf.

Veuillez jeter un coup d'œil aux contenus .xaml et .cs.

Merci à l'avance,

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> 

et le contenu .cs connexe:

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

Répondre

34

Vous définissez UpdateSourceTrigger = PropertyChanged dans votre fixation Checkbox IsChecked dans le DataTemplate: <CheckBox IsChecked="{Binding Path=IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

+0

Cela fonctionne très bien, mais cela ne fonctionne pas comme prévu. Lorsque vous tapez une lettre, l'objet est immédiatement modifié. Que se passe-t-il si vous avez un déclencheur qui déclenche le gestionnaire de validation? cela signifie qu'il tire 1000 fois si vous tapez 1000 symboles? Ça n'est pas correct. – Dilshod

+1

Cela peut être une solution acceptable, en suivant l'événement LostFocus. Vincent

+0

@Dilshod Qu'entendez-vous par là qu'il se déclenchera 1000 fois si l'on tape 1000 symboles? nous parlons d'une case à cocher, non? –

5

est ici l'affaire, le fonctionnement de la grille de données, est qu'il crée un affichage des données et l'affiche à la place des données d'origine, par conséquent, lorsque vous liez simplement une propriété dans le CellTemplate, il n'est pas propagé de la vue vers les données. Ce que vous devez faire est d'utiliser le CellEditingTemplate de sorte que la grille de données sache quand vous éditez, et peut le propager aux données quand fait (ou il peut l'annuler si vous annulez).

Voici le XAML modifié pour vous:

<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

Je ne pense pas que ce soit vrai. Cela fonctionne parfaitement pour moi sans le CellEditingTemplate utilisant la réponse de Sese. Le CellEditingTemplate a l'air de compliquer les choses et de les rendre plus difficiles pour l'utilisateur. Sûrement plus d'un clic serait nécessaire pour cliquer sur la case à cocher. – MikeKulls

Questions connexes