Привязка элемента управления к другому элементу управления через ElementName, но начальное значение не отображается

У меня есть два элемента управления: WPF DatePicker и набор расширений WPF DateTimeUpDown. DatePicker имеет двустороннюю привязку к свойству DateTime в ViewModel, а DateTimeUpDown имеет привязку к DatePicker через Element.

Привязка отлично работает при прокрутке DateTimeUpDown, это меняет элемент управления DatePicker. Однако при установке начального значения свойства в ViewModel значение DateTimeUpDown не устанавливается.

Это примерно так: в Resources.xaml

<StackPanel Name="StartDate" Visibility="Collapsed">
  <TextBlock Text="Start Date" Margin="0, 0, 0, 2" />
  <DatePicker Name="StartDatePicker"  SelectedDate="{Binding FromDateTime, Mode=TwoWay, ValidatesOnDataErrors=True}" IsTodayHighlighted="False" Uid="ReportingStartDay" />
</StackPanel>
<StackPanel Name="StartTime" Visibility="Collapsed">
  <TextBlock Text="Start Time" Margin="0, 0, 10, 2" />                        
  <xctk:DateTimeUpDown Value="{Binding ElementName=StartDatePicker, Path=SelectedDate, Mode=TwoWay}" Background="White" Format="ShortTime" Height="26"  Margin="0,1,5,0" TextAlignment="Left"></xctk:DateTimeUpDown>
</StackPanel>

В ViewModel

private DateTime fromDateTime;
public DateTime FromDateTime {
  get { return fromDateTime; }
  set {
    fromDateTime = value;
    OnPropertyChanged("FromDateTime");
  }
}

Когда установлен FromDateTime, DatePicker установлен правильно, однако значение DateTimeUpDown не установлено.


Сейчас я попытался добавить трассировку для привязки, которая, к сожалению, не сильно мне помогает:

System.Windows.Data Warning: 56 : Created BindingExpression (hash=36462666) for Binding (hash=21177529)
System.Windows.Data Warning: 58 :   Path: 'SelectedDate'
System.Windows.Data Warning: 62 : BindingExpression (hash=36462666): Attach to Xceed.Wpf.Toolkit.DateTimeUpDown.Value (hash=6941388)
System.Windows.Data Warning: 67 : BindingExpression (hash=36462666): Resolving source 
System.Windows.Data Warning: 70 : BindingExpression (hash=36462666): Found data context element: <null> (OK)
System.Windows.Data Warning: 74 :     Lookup name EndDatePicker:  queried DateTimeUpDown (hash=6941388)
System.Windows.Data Warning: 78 : BindingExpression (hash=36462666): Activate with root item DatePicker (hash=55504765)
System.Windows.Data Warning: 108 : BindingExpression (hash=36462666):   At level 0 - for DatePicker.SelectedDate found accessor DependencyProperty(SelectedDate)
System.Windows.Data Warning: 104 : BindingExpression (hash=36462666): Replace item at level 0 with DatePicker (hash=55504765), using accessor DependencyProperty(SelectedDate)
System.Windows.Data Warning: 101 : BindingExpression (hash=36462666): GetValue at level 0 from DatePicker (hash=55504765) using DependencyProperty(SelectedDate): DateTime (hash=-1518077112)
System.Windows.Data Warning: 80 : BindingExpression (hash=36462666): TransferValue - got raw value DateTime (hash=-1518077112)
System.Windows.Data Warning: 89 : BindingExpression (hash=36462666): TransferValue - using final value DateTime (hash=-1518077112)

ОБНОВИТЬ

Я нашел проблему. Очевидно, моя проблема была связана с привязкой к специализированному классу, где свойство было определено в родительском классе. При "переопределении" реализации свойства в унаследованном классе это работает. Это не имеет смысла, но это работает.

2 ответа

Возможно, вы захотите попробовать отладить привязку вашего DateTimeUpDown. Что-то вроде:

<Window …
xmlns:diagnostics="clr-namespace:System.Diagnostics;assembly=WindowsBase"
/>
 <xctk:DateTimeUpDown Value="{Binding ElementName=StartDatePicker, Path=SelectedDate, Mode=TwoWay, diagnostics:PresentationTraceSources.TraceLevel=High}" ...></xctk:DateTimeUpDown>

Это создаст дополнительную информацию в вашем окне вывода, которая может помочь точно определить, где значение теряется.

Более подробная информация здесь: Отладка привязок WPF

Вы должны попытаться добавить UpdateSourceTrigger=PropertyChanged во втором переплете.

При двустороннем связывании это заставит его обновлять источник событий PropertyChanged.

Другие вопросы по тегам