WPF - Как использовать UserControl со свойством зависимости и моделью представления? - PullRequest
1 голос
/ 20 апреля 2010

Моя цель - чтобы пользователь выбрал год и месяц. Переведите выбор в дату и попросите пользовательский элемент управления отправить дату обратно в мою модель просмотра. Эта часть работает для меня .... Однако я не могу получить начальную дату ViewModel, чтобы установить эти выпадающие списки.

   public static readonly DependencyProperty Date =
      DependencyProperty.Register("ReturnDate", typeof(DateTime), typeof(DatePicker),
      new FrameworkPropertyMetadata{BindsTwoWayByDefault = true,});

   public DateTime ReturnDate
     {
        get { return Convert.ToDateTime(GetValue(Date)); }
        set
        {
            SetDropDowns(value);
            SetValue(Date, value);
        }
     }

SetDropDowns (значение) просто устанавливает выбранные элементы в полях со списком, однако программа никогда не делает этого метода.

В представлении, которое я использую:

  <cc1:DatePicker ReturnDate="{Binding Path=StartDate, Mode=TwoWay}" IsStart="True" />

Если на это ответили, значит, плохо. Я огляделся и не увидел ничего, что помогло бы мне. Таким образом, когда программа загружается, как я могу получить значение из модели представления в метод для установки полей со списком?

Спасибо

-Скотт

1 Ответ

2 голосов
/ 20 апреля 2010

Когда вы используете свойство зависимости, свойство CLR Setter никогда не запускается (когда привязка устанавливает свойство).

Правильный способ сделать это - использовать PropertyChangedCallback в свойстве зависимости:

public static readonly DependencyProperty Date =
  DependencyProperty.Register("ReturnDate", typeof(DateTime), typeof(DatePicker),
  new FrameworkPropertyMetadata(
        DateTime.Now, 
        FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
        new PropertyChangedCallback(dateChanged)));

public DateTime ReturnDate
 {
    get { return Convert.ToDateTime(GetValue(Date)); }
    set
    {
        SetDropDowns(value);
        SetValue(Date, value);
    }
 }

private static void dateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
  DatePicker instance = d as DatePicker;
  instance.SetDropDowns((DateTime)e.NewValue);
}
...