2010-05-28 10 views
14

Estoy usando la cuadrícula de datos de wpf 4.0. Esto tiene una TemplateColumn que contiene una casilla de verificación. La propiedad IsChecked de la casilla de verificación se establece mediante enlace.wpf 4.0 plantilla de red de datos columna problema de enlace bidireccional

El problema es que incluso si especifico que el modo de encuadernación explícitamente sea TwoWay, funciona solo en una dirección.

Tengo que mencionar que el mismo código funciona perfectamente en .net 3.5 con la cuadrícula de datos del wpf toolkit.

Por favor, eche un vistazo a los contenidos .xaml y .cs.

Gracias de antemano,

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> 

y el contenido de Cs relacionada:

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

Respuesta

34

configura UpdateSourceTrigger = PropertyChanged en su casilla de verificación IsChecked vinculante en el DataTemplate: <CheckBox IsChecked="{Binding Path=IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

+0

Esto funciona bien, pero esto no está funcionando como se esperaba. Cuando escribe una letra, cambia el objeto de inmediato. ¿Qué sucede si tienes un disparador que dispara el controlador de validación? significa que dispara 1000 veces si escribe 1000 símbolos? Esto no está bien. – Dilshod

+1

Esta podría ser una solución aceptable para rastrear el evento LostFocus. Vincent

+0

@Dilshod ¿a qué te refieres con que disparará 1000 veces si uno escribe 1000 símbolos? estamos hablando de una casilla de verificación, ¿verdad? –

5

Este es el trato, la forma en que funciona la red de datos, es que se crea una la vista de datos y la muestra en lugar de los datos originales, por lo tanto, cuando simplemente enlaza una propiedad en el CellTemplate, no se propaga de la vista a los datos.

Lo que necesita hacer es utilizar el CellEditingTemplate para que la cuadrícula de datos sepa cuando está editando, y puede propagarlo a los datos cuando termine (o puede deshacerlo si cancela).

Aquí está el XAML modificado para ti:

<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

no creo que esto es cierto. Funciona perfectamente para mí sin CellEditingTemplate usando la respuesta de Sese. El CellEditingTemplate parece complicar demasiado las cosas y hacerlas más difíciles para el usuario. Sin duda, se necesitaría más de un clic para hacer clic en la casilla de verificación. – MikeKulls

Cuestiones relacionadas