Silverlight自定义控件和数据绑定在WP7中无法正常工作

时间:2011-01-31 11:07:05

标签: data-binding windows-phone-7 custom-controls

我正在尝试使用数据绑定创建日历控件。

    public partial class Calendar : UserControl
    {
        public static readonly DependencyProperty DateProperty =
        DependencyProperty.Register("Date", typeof(DateTime),
        typeof(Calendar), null);



        public object Date
        {
            get { return GetValue(DateProperty); }
            set
            {
                SetValue(DateProperty, value);
                OnPropertyChanged("Date");
            }
        }

        public Calendar()
        {
            // Required to initialize variables
            InitializeComponent();
   DayText.Text = ((DateTime)Date).ToString("dd");
            MonthText.Text = ((DateTime)Date).ToString("MMM");
            this.Loaded += new RoutedEventHandler(Calendar_Loaded);
            this.GotFocus += new RoutedEventHandler(Calendar_Loaded);
        }


        void Calendar_Loaded(object sender, RoutedEventArgs e)
        {
            DayText.Text = ((DateTime)Date).ToString("dd");
            MonthText.Text = ((DateTime)Date).ToString("MMM");

        }
    }

但是当我使用此控件创建列表框时,同一个calndar的日期错误。我确信通过彻底数据绑定的日期是正确的,但我不明白为什么同一个日历显示不同的一天(我注意到这是前一个日历控件的日期)

感谢您的支持!

1 个答案:

答案 0 :(得分:2)

嗯......我们从哪里开始?以下是我注意到的一些事情:

  • 如果您使用的是依赖项属性,则无需从OnPropertyChanged属性设置器调用Date
  • 依赖项属性将类型声明为DateTime,但您的公开公开属性的类型为object,然后要求您将其转换为其他类型。
  • 如果要在更多情况下调用Calendar_Loaded而不是响应Loaded事件(例如GotFocus事件,那么我建议您将其称为其他内容,或者创建一个具有相关名称的方法(例如UpdateDateParts),并从正确命名的单独事件处理程序中调用它。
  • 处理日期字符串时使用固定格式说明符不能很好地进行本地化。

除此之外,我建议您可以通过使用绑定并公开Date依赖项属性的日期部分而不是支持数据绑定(和重新模板化)来实现用户界面。手动更新事件处理程序中某些文本块/框的Text属性。实际上,如果你派生自Control而不是UserControl那么你可以创建并实现无外观控件,它具有由themes \ generic.xaml中的样式定义的用户界面,可以由用户重新定义你的控制权。

至于为什么日历在日历控件的不同实例中不正确,我们需要查看一些XAML /代码,以了解如何使用和初始化控件以便能够提供更好的答案。但是,我认为上述内容值得一个答案,而不是试图在评论中说出来。