WPF - 如何将UserControl与依赖项属性和视图模型一起使用?

时间:2010-04-20 17:31:59

标签: c# wpf wpf-controls user-controls dependency-properties

我的目标是让用户选择一年和一个月。将选择内容转换为日期,并让用户控件将日期发送回我的视图模型。那部分对我有用......但是,我无法获得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(value)只是在组合框上设置选定的项目,但程序永远不会使用该方法。

在我正在使用的视图上:

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

如果这已经回答了,那我就不好了。我环顾四周,没有看到任何对我有用的东西。因此,当程序加载时如何从视图模型中获取值以设置组合框?

谢谢,

-Scott

1 个答案:

答案 0 :(得分:2)

使用依赖项属性时,永远不会触发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);
}