Связывание WPF DataGrid и Avalon TimePicker не работает - PullRequest
0 голосов
/ 26 мая 2010

Я использую DataFrid WPF из набора инструментов 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>

А это моя 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 голосов
/ 15 июля 2011

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

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

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

0 голосов
/ 31 мая 2010

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

Edit:

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

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

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

    SelectedTime = "{Диапазон привязки, режим = двухсторонний, UpdateSourceTrigger = PropertyChanged}"

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

Приветствия

-Leigh

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...