Пользовательский элемент управления Silverlight и привязка данных не работают должным образом в WP7 - PullRequest
0 голосов
/ 31 января 2011

Я пытаюсь создать свой элемент управления календаря с привязкой данных.

    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 Ответ

2 голосов
/ 31 января 2011

Хм ... с чего начать?Вот несколько вещей, которые я заметил:

  • Если вы используете свойство зависимостей, нет необходимости вызывать OnPropertyChanged из установщика свойства Date.
  • Свойство зависимостей объявляет тип как DateTime, но ваше открытое свойство имеет тип object, что требует от вас его приведения в другое место.
  • Если Calendar_Loaded вызывается в большем количестве ситуаций, чем вВ ответ на событие Loaded (например, событие GotFocus, я бы порекомендовал вам вызвать его как-нибудь еще или создать метод с соответствующим именем (например, UpdateDateParts) и вызвать его из правильно названных отдельных обработчиков событий.
  • Использование фиксированных форматных спецификаторов, когда обработка строк даты плохо локализуется.

В дополнение к этому, я бы предложил, чтобы вы могли реализовать пользовательский интерфейс способом, который поддерживает привязку данных(и повторный шаблон), используя привязки и выставляя части даты свойства зависимости Date вместо того, чтобы вручную обновлять свойство Text некоторого текстаблоки / ящики в обработчиках событий.Фактически, если вы наследуете Control вместо UserControl, вы можете создать и задействовать элемент управления без внешнего вида, пользовательский интерфейс которого определяется стилем в themes \ generic.xaml, который может быть переопределен пользователями вашего элемента управления.

Что касается того, почему дата неверна в разных экземплярах вашего календарного элемента управления, нам нужно было бы увидеть некоторые из ваших XAML / кодов, чтобы увидеть, как этот элемент управления используется и инициализируется, чтобы иметь возможность обеспечить лучшееответ.Однако я подумал, что вышесказанное стоит добавить в ответ, вместо того, чтобы пытаться сказать это в комментарии.

...