переплет коллекции silverlight 3 - PullRequest
1 голос
/ 09 ноября 2009

Кто-то, пожалуйста, помогите мне понять, почему эта привязка не работает ...

У меня есть класс SelectionManager со свойством date, которое заполняется службой WCF. Свойство представляет собой массив структур, которые связывают DateTime и целое число бизнес-объектов.

public class SelectionManager : INotifyPropertyChanged {

    ... other properties ...

    public DQMServiceDateCountPair[] dates { get; private set; }

    public event PropertyChangedEventHandler PropertyChanged;

    public void NotifyPropertyChanged(string propertyName) {
        if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); }
    }

У меня есть другой класс с именем DateSelector, у которого есть свойство DependencyProperty, называемое настройками «пар», которое является целью привязки «дат».

public partial class DateSelector : UserControl {

... other stuff ...

public static readonly DependencyProperty pairsProperty = DependencyProperty.Register(
    "pairs",
    typeof(DQMServiceDateCountPair[]),
    typeof(DateSelector),
    new PropertyMetadata(new DQMServiceDateCountPair[0])
);

public DQMServiceDateCountPair[] pairs {
    get { return (DQMServiceDateCountPair[])GetValue(pairsProperty); }
    set { 
        Debug.WriteLine("adding dates");
        SetValue(pairsProperty, value);
        dateMode = DateMode.Years;
    }
}

}

В моем MainPage.xaml у меня есть такая строка:

<date:DateSelector x:Name="dateSelector" pairs="{Binding dates}" />

Это странно, потому что все мои другие привязки в MainPage.xaml корректно обновляются, включая ComboBox, привязанный к «датам». Мой UserControl, однако, не будет обновляться. Debug.Writeline не вызывается в операторе set свойства 'pair'.

Играя с ним, я попытался превратить свойство DQMServiceDateCountPair [] в ObservableCollection и реализовать INotifyCollectionChanged, но это не помогает.

Если я оставлю либо свойство источника, либо свойство цели в виде массива и сделаю другое ObservableCollection, то получу ошибку привязки, которая говорит о том, что он не может автоматически преобразовывать одно в другое, поэтому Silverlight, кажется, знает о привязка, просто не обновляется.

Может кто-нибудь помочь?

P.S. Я использую Silverlight 3.

Ответы [ 3 ]

0 голосов
/ 10 ноября 2009

Что на самом деле странно, так это то, что другие вещи работают, когда вы закодировали свой класс так, как вы это делаете. Я предполагаю, что массив dates устанавливается некоторым кодом, который выполняется внутри вашего менеджера выбора по завершении запроса WCF.

Однако, пока вы реализовали INotifyPropertyChanged, вы фактически не вызываете событие, которое оно определяет. Вы не можете объединить INotifyPropertyChanged с синтаксисом автоматического свойства C #. Вам нужно это: -

public SelectionManager : INotifyPropertyChanged
{
   private DQMServiceDateCountPair[] myDates;
   public DQMServiceDateCountPair[] dates
   {
     get { return myDates; }
     set
     {
       myDates = value;
       NotifyPropertyChanged("dates");
     }
     // rest of your code
}
0 голосов
/ 10 ноября 2009

Итак, вот что происходит. Обвязка работала отлично все это время. В течение прошлой недели я боролся с этим, он с радостью обновлялся - но из-за ошибочного предположения с моей стороны я никогда не мог видеть это.

В случае, если кто-то еще питает это ошибочное предположение, позвольте мне объяснить это:

Вызовы GetValue и SetValue не выполняются автоматически в силу того, что вы объявляете свойство зависимости. Часть new PropertyMetadata () в объявлении имеет перегрузку, которая принимает метод обратного вызова. В этом методе обратного вызова вы должны установить значение свойства самостоятельно. Например, в моем коде я сделал это вызов PropertyMetadata:

new PropertyMetadata(new PropertyChangedCallback(OnPairsPropertyChanged))

и метод обратного вызова выглядит следующим образом:

private static void OnPairsPropertyChanged( DependencyObject d, DependencyPropertyChangedEventArgs e ) {
    ((DateSelector)d).pairs = (DQMServiceDateCountPair[])e.NewValue;
}

Спасибо всем, кто пытался помочь!

0 голосов
/ 09 ноября 2009

Попробуйте изменить код следующим образом:
1. Добавьте атрибуты DataMember / DataContract
2. Сделайте «набор» публичным

[DataContract]
public class SelectionManager : INotifyPropertyChanged {

    [DataMember]
    public DQMServiceDateCountPair[] dates { get; set; }

    public event PropertyChangedEventHandler PropertyChanged;

    public void NotifyPropertyChanged(string propertyName) {
        if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...