我正在使用wpf工具包中的WPF DataGrid和来自AvalonControlsLibrary的TimePicker来插入TimeSpans的集合。我的问题是绑定在DataGrid中不起作用,我不知道为什么这不起作用。
这是我的设置:
我有以下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 :(得分:0)
你的绑定是什么意思不起作用?当您尝试编辑值时,在timepicker控件中是否没有值?
修改强>
好的,昨天我遇到了同样的问题,我认为这个问题有2个部分。
如果切换到编辑模式时TimePicker控件中没有出现任何值,则控件可能存在绑定问题。
我发现使用DataGridTemplateColumn时遇到的基础值绑定。基本上,网格不使用常规绑定列的相同机制来处理您的数据绑定。这意味着您需要对列中的控件执行以下绑定:
SelectedTime =“{Binding Span,Mode = TwoWay,UpdateSourceTrigger = PropertyChanged}”
这会将绑定修复回底层对象。但是,如果控件仍然存在问题,则可能对您没有多大帮助。抱歉,我还没有使用过AvalonControlsLibrary,所以不确定那里是否存在潜在的问题。修复步骤2解决了我的问题。
干杯
-Leigh
答案 1 :(得分:0)
我知道这是一个老问题,但我在玩这个具有完全相同问题的确切控件。我查看了AvalonControlsLibrary的TimePicker类,构造函数看起来像这样
/// <summary>
/// Default constructor
/// </summary>
public TimePicker()
{
SelectedTime = DateTime.Now.TimeOfDay;
}
删除行设置SelectedTime恢复了数据绑定行为,使我的发布示例按预期工作。