2010-05-26 4 views
0

J'utilise un DataGrid WPF de la boîte à outils wpf et un TimePicker d'AvalonControlsLibrary pour insérer une collection de TimeSpans. Mon problème est que les liaisons ne fonctionnent pas dans le DataGrid, et je n'ai aucune idée de pourquoi cela ne fonctionne pas.La liaison WPF DataGrid et Avalon TimePicker ne fonctionne pas

Voici ma configuration:

je le XAML suivant:

<Window x:Class="TestMainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:wpf="http://schemas.microsoft.com/wpf/2008/toolkit" xmlns:a="http://schemas.AvalonControls/AvalonControlsLibrary/Controls" SizeToContent="WidthAndHeight" MinHeight="250" MinWidth="300"> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 
    <GroupBox Grid.Row="0"> 
     <GroupBox.Header> 
      Testing it: 
     </GroupBox.Header> 
     <wpf:DataGrid ItemsSource="{Binding Path=TestSpans}" AutoGenerateColumns="False"> 
      <wpf:DataGrid.Columns> 
       <wpf:DataGridTemplateColumn Header="Start"> 
        <wpf:DataGridTemplateColumn.CellEditingTemplate> 
         <DataTemplate> 
          <a:TimePicker SelectedTime="{Binding Path=Span, Mode=TwoWay}" /> 
         </DataTemplate> 
        </wpf:DataGridTemplateColumn.CellEditingTemplate> 
        <wpf:DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding Path=Span}" /> 
         </DataTemplate> 
        </wpf:DataGridTemplateColumn.CellTemplate> 
       </wpf:DataGridTemplateColumn> 
      </wpf:DataGrid.Columns> 
     </wpf:DataGrid> 
    </GroupBox> 
    <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Grid.Row="1"> 
     <a:TimePicker SelectedTime="{Binding Path=SelectedTime, Mode=TwoWay}" /> 
    </StackPanel> 
</Grid> 

Et voici mon ViewModel:

Imports System.Collections.ObjectModel 

Public Class TestMainWindowViewModel 

    Private _selectedTime As TimeSpan = DateTime.Now.TimeOfDay 
    Public Property SelectedTime() As TimeSpan 
     Get 
      Return _selectedTime 
     End Get 
     Set(ByVal value As TimeSpan) 
      _selectedTime = value 
     End Set 
    End Property 

    Private _testSpans As ObservableCollection(Of TimeSpanContainer) = New ObservableCollection(Of TimeSpanContainer) 
    Public Property TestSpans() As ObservableCollection(Of TimeSpanContainer) 
     Get 
      Return _testSpans 
     End Get 
     Set(ByVal value As ObservableCollection(Of TimeSpanContainer)) 
      _testSpans = value 
     End Set 
    End Property 

    Public Sub New() 
     _testSpans.Add(DateTime.Now.TimeOfDay) 
     _testSpans.Add(DateTime.Now.TimeOfDay) 
     _testSpans.Add(DateTime.Now.TimeOfDay) 
    End Sub 

End Class 

Public Class TimeSpanContainer 

    Private _span As TimeSpan 
    Public Property Span() As TimeSpan 
     Get 
      Return _span 
     End Get 
     Set(ByVal value As TimeSpan) 
      _span = value 
     End Set 
    End Property 

    Public Sub New(ByVal t As TimeSpan) 
     _span = t 
    End Sub 

End Class 

Je commence cette fenêtre application.xaml.vb aime ça:

Class Application 

    ' Application-level events, such as Startup, Exit, and DispatcherUnhandledException 
    ' can be handled in this file. 
    Protected Overrides Sub OnStartup(ByVal e As System.Windows.StartupEventArgs) 
     MyBase.OnStartup(e) 
     Dim window As TestMainWindow = New TestMainWindow 

     window.DataContext = New TestMainWindowViewModel() 

     window.Show() 

    End Sub 

End Class 

EDIT 1: J'ai oublié de mentionner que la liaison à SelectedTime TimeSpan fonctionne comme prévu. Le problème sont les liaisons dans le DataGrid.

EDIT 2: Changement d'exemple un peu pour mieux montrer le problème.

Répondre

0

Que voulez-vous dire par vos fixations ne fonctionnent pas? N'obtenez-vous aucune valeur dans le contrôle timepicker lorsque vous essayez de modifier la valeur?

Edit:

Ok, j'avais cette même question hier et je pense qu'il ya 2 parties à la question.

  1. S'il n'y a pas de valeur apparaissant dans le contrôle TimePicker lorsque vous passez en mode édition alors il y a probablement un problème de liaison avec le contrôle.

  2. La liaison à la valeur sous-jacente s'est avérée être un problème avec l'utilisation de DataGridTemplateColumn. Fondamentalement, la grille ne gère pas votre liaison de données en utilisant les mêmes mécanismes de colonnes liées régulières. Ce que cela signifie est que vous devez effectuer les opérations suivantes de liaison sur vos commandes dans la colonne:

    SelectedTime = "{Binding Span, mode = TwoWay, UpdateSourceTrigger = PropertyChanged}"

Cela corrigera la liaison retour à l'objet sous-jacent. Cependant, s'il y a toujours un problème avec le contrôle, cela peut ne pas vous aider beaucoup. Désolé mais je n'ai pas utilisé AvalonControlsLibrary donc je ne sais pas s'il y a un problème potentiel. La fixation de l'étape 2 a résolu mes problèmes.

Vive

-Leigh

+0

Oui, c'est vrai. Quand je passe en mode d'édition, la valeur du contrôle timepicker est définie sur l'heure actuelle et quand j'ai fini d'éditer la valeur sur le bloc de texte est la même qu'avant, donc la valeur du TimeSpanContainer.Span que je modifie ne change jamais . –

+0

Je vais vérifier et voir si cela fonctionne en ajoutant UpdateSourceTrigger. Merci pour votre aide. –

0

Je sais que c'est une vieille question, mais je joue avec ce où un contrôle précis ayant exactement le même problème. Je regardais dans la classe TimePicker de AvalonControlsLibrary et le constructeur se présente comme suit

/// <summary> 
/// Default constructor 
/// </summary> 
public TimePicker() 
{ 
    SelectedTime = DateTime.Now.TimeOfDay; 
} 

Retrait de la ligne de réglage du SelectedTime restauré le comportement de liaison de données pour moi de faire votre travail par exemple affiché le comme prévu.

Questions connexes