WPF DataGrid和Avalon TimePicker绑定无法正常工作

时间:2010-05-26 06:48:46

标签: wpf vb.net xaml data-binding datagrid

我正在使用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:稍微更改一些示例以更好地显示问题。

2 个答案:

答案 0 :(得分:0)

你的绑定是什么意思不起作用?当您尝试编辑值时,在timepicker控件中是否没有值?

修改

好的,昨天我遇到了同样的问题,我认为这个问题有2个部分。

  1. 如果切换到编辑模式时TimePicker控件中没有出现任何值,则控件可能存在绑定问题。

  2. 我发现使用DataGridTemplateColumn时遇到的基础值绑定。基本上,网格不使用常规绑定列的相同机制来处理您的数据绑定。这意味着您需要对列中的控件执行以下绑定:

    SelectedTime =“{Binding Span,Mode = TwoWay,UpdateSourceTrigger = PropertyChanged}”

  3. 这会将绑定修复回底层对象。但是,如果控件仍然存在问题,则可能对您没有多大帮助。抱歉,我还没有使用过AvalonControlsLibrary,所以不确定那里是否存在潜在的问题。修复步骤2解决了我的问题。

    干杯

    -Leigh

答案 1 :(得分:0)

我知道这是一个老问题,但我在玩这个具有完全相同问题的确切控件。我查看了AvalonControlsLibrary的TimePicker类,构造函数看起来像这样

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

删除行设置SelectedTime恢复了数据绑定行为,使我的发布示例按预期工作。