Привязка WPF DataGrid и Avalon TimePicker не работает

Я использую WPF DataGrid из набора инструментов wpf и TimePicker из AvalonControlsLibrary для вставки коллекции 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>

And this is my 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: Немного изменен пример, чтобы лучше показать проблему.


person Jorge Vargas    schedule 26.05.2010    source источник


Ответы (2)


Что вы имеете в виду, говоря, что ваши привязки не работают? Вы не получаете значения в элементе управления таймером, когда пытаетесь изменить значение?

Изменить:

Хорошо, вчера у меня была такая же проблема, и я думаю, что проблема состоит из двух частей.

  1. Если при переключении в режим редактирования в элементе управления TimePicker не отображается значение, вероятно, существует проблема с привязкой элемента управления.

  2. Я обнаружил, что привязка к базовому значению связана с использованием DataGridTemplateColumn. По сути, сетка не обрабатывает вашу привязку данных, используя те же механизмы, что и обычные связанные столбцы. Это означает, что вам нужно выполнить следующую привязку к вашим элементам управления в столбце:

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

Это исправит привязку обратно к базовому объекту. Однако, если все еще есть проблема с управлением, это может вам не сильно помочь. Извините, но я не использовал AvalonControlsLibrary, поэтому не уверен, что там есть потенциальная проблема. Исправление шага 2 решило мои проблемы.

Ваше здоровье

-Ли

person Leigh S    schedule 31.05.2010
comment
Да, это верно. Когда я вхожу в режим редактирования, значение элемента управления timepicker устанавливается на текущее время, и когда я закончу редактирование, значение в текстовом блоке такое же, как и раньше, поэтому значение TimeSpanContainer.Span, которое я редактирую, никогда не меняется . - person Jorge Vargas; 31.05.2010
comment
Я проверю это и посмотрю, работает ли это, добавив UpdateSourceTrigger. Спасибо за помощь. - person Jorge Vargas; 09.06.2010

Я знаю, что это старый вопрос, но я играл с этим точным элементом управления, имея точно такую ​​​​же проблему. Я посмотрел в классе TimePicker AvalonControlsLibrary, и конструктор выглядит так

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

Удаление строки, устанавливающей SelectedTime, восстановило для меня поведение привязки данных, заставив ваш опубликованный пример работать так, как предполагалось.

person thmsn    schedule 14.07.2011