Ваша реализация свойства DateTimeValue, показанного в этом вопросе, определенно неверна и приводит к исключению, поскольку DateTimeValue должен быть свойством зависимости.
Но вы упомянули, что пытались использовать свойство зависимости безуспешно. Я полагаю, причина в конфликте DataContexts, и ваш XAML выглядит так:
<UserControl x:Class="Test.SomeView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:self="clr-namespace:Test"
Name="Root">
<WrapPanel>
<self:TimerControl Time="{Binding StartTime}"/>
</WrapPanel>
</UserControl>
Этот код не работает. Зачем? DataContext TimerControl наследуется (или, может быть, вы вообще его заменяете), в то время как когда вы обращаетесь к StartTime, вы имеете в виду ViewModel как DataContext. Таким образом, вы должны четко указать правильный DataContext:
<self:Timer Time="{Binding DataContext.StartTime, ElementName=Root}"/>
=== ОБНОВЛЕНИЕ ===
Весь код моего элемента управления Timer (как вы можете видеть, у моего Timer есть текстовое поле, когда вы вводите некоторый текст, текстовое поле вызывает соответствующее событие, которое мы обрабатываем и устанавливаем свойство Time):
public partial class Timer : UserControl
{
public Timer()
{
InitializeComponent();
}
public DateTime? Time
{
get
{
return (DateTime?)this.GetValue(Timer.TimeProperty);
}
set
{
this.SetValue(Timer.TimeProperty, value);
}
}
public static readonly DependencyProperty TimeProperty =
DependencyProperty.Register("Time",
typeof(DateTime?),
typeof(Timer),
new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, (d, e) => { }));
private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
if (DateTime.Now.Ticks % 2 == 0)
{
this.Time = DateTime.Now;
}
else
{
this.Time = null;
}
}
}
И XAML:
<UserControl x:Class="Test.Timer">
<Grid>
<TextBox TextChanged="TextBox_TextChanged"/>
</Grid>
</UserControl>
Использование контроля времени в XAML:
<UserControl x:Class="Test.StartupView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:self="clr-namespace:Test"
Name="Root">
<WrapPanel>
<self:Timer Time="{Binding DataContext.StartTime, ElementName=Root}"/>
</WrapPanel>
</UserControl>
Код позади StartupView:
public StartupView()
{
InitializeComponent();
this.DataContext = new ViewModel();
}
Свойство во ViewModel остается прежним. Во время отладки сеттер свойства StartTime срабатывает каждый раз, когда я меняю текст в Timer.