2010-05-26 88 views
0

我正在使用wpf工具包中的WPF DataGrid和AvalonControlsLibrary中的TimePicker插入TimeSpans的集合。我的問題是綁定不在DataGrid內部工作,我不知道爲什麼這不起作用。WPF DataGrid和Avalon TimePicker綁定不起作用

這裏是我的設置:

我有以下XAML:

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

,這是我的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 

我開始這個窗口像這樣的application.xaml.vb:

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 

編輯1:我忘了提及與SelectedTime TimeSpan的綁定按預期工作。問題是DataGrid內部的綁定。

編輯2:更改了一些示例以更好地顯示問題。

回答

0

你的綁定意味着什麼不起作用?當您嘗試編輯值時,您是否在時間選擇器控件中沒有任何價值?

編輯:

好吧,我昨天有這個同樣的問題,我認爲有2個部分的問題。

  1. 如果在切換到編輯模式時TimePicker控件中沒有出現任何值,那麼可能與控件存在綁定問題。

  2. 對底層值的綁定我發現是使用DataGridTemplateColumn的問題。基本上,網格不會使用規則綁定列的相同機制處理數據綁定。它的意思是,你需要列內對你的控件執行以下綁定:

    SelectedTime =「{結合跨度,模式=雙向,UpdateSourceTrigger =的PropertyChanged}」

這將解決這個結合回到底層對象。但是,如果仍存在控制問題,它可能無法幫助您。對不起,我沒有使用過AvalonControlsLibrary,所以不確定是否有潛在的問題。修復步驟2解決了我的問題。

乾杯

-Leigh

+0

是的,沒錯。當我進入編輯模式時,timepicker控件的值被設置爲當前時間,並且當我完成編輯時,textblock上的值與以前相同,所以我編輯的TimeSpanContainer.Span的值永遠不會改變。 – 2010-05-31 16:14:06

+0

我會檢查出來,並通過添加UpdateSourceTrigger來查看它是否工作。感謝您的幫助人。 – 2010-06-09 12:46:57

0

我知道這是一個老問題,但我在那裏與具有完全相同的問題,這個精確控制播放。我看着在TimePicker類AvalonControlsLibrary和構造看起來像這樣

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

刪除線設置SelectedTime恢復數據綁定的行爲,我讓你貼出的例子工作按預期。