2009-11-09 7 views
1

Quelqu'un s'il vous plaît me aider à comprendre pourquoi cette liaison ne fonctionne pas ...silverlight 3 collection liant

J'ai une classe appelée SelectionManager avec une propriété appelée « date » qui est peuplé par un service WCF. La propriété est un tableau de structures qui regroupe un horodatage et un nombre entier d'objets métier.

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)); } 
    } 

J'ai une autre classe appelée dateSelector qui a un DependencyProperty appelé « paires » installation pour être la cible juridiquement contraignante des dates ».

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; 
    } 
} 

} 

Dans mon MainPage.xaml, j'ai une ligne comme ceci:

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

Il est bizarre, parce que tous mes autres liaisons dans la mise à jour MainPage.xaml correctement, y compris un ComboBox lié aux « dates » . Mon UserControl cependant, ne mettra pas à jour. La ligne Debug.Writeline n'est pas appelée dans l'instruction set de la propriété 'paires'. En jouant avec cela, j'ai essayé de transformer la propriété DQMServiceDateCountPair [] en ObservableCollection et en implémentant INotifyCollectionChanged, mais cela n'aide pas. Si je laisse la propriété source ou la propriété target sous forme de tableau et que l'autre est ObservableCollection, j'obtiens une erreur de liaison qui indique qu'elle ne peut pas convertir automatiquement l'un à l'autre. Silverlight semble donc connaître la liaison, il ne suffit pas de le mettre à jour.

Quelqu'un peut-il aider?

P.S. J'utilise Silverlight 3.

Répondre

0

Alors, voici ce qui se passe. La reliure a parfaitement fonctionné tout ce temps. La semaine dernière, j'ai eu du mal avec ça, ça a été heureusement mis à jour - mais à cause d'une supposition erronée de ma part, je n'ai jamais pu le voir.

Au cas où quelqu'un d'autre cette hypothèse ports défectueux, laissez-moi épeler:

Les appels GetValue et SetValue ne sont pas faits automatiquement en vertu du fait que vous déclarez une propriété de dépendance. La partie "new PropertyMetadata()" de la déclaration a une surcharge qui prend une méthode de rappel. Dans cette méthode de rappel, vous devez définir vous-même la valeur de la propriété.Par exemple, dans mon code, je fait ce PropertyMetadata l'appel:

new PropertyMetadata(new PropertyChangedCallback(OnPairsPropertyChanged)) 

et la méthode de rappel lit comme suit:

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

Merci à tous ceux qui ont essayé d'aider!

0

Essayez de changer votre code comme suit: 1. Ajouter
DataMember/DataContract attributs
2. Marque "ensemble" du public

[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)); } 
    } 
+0

Je pense que vous pourriez mal comprendre le problème. La classe SelectionManager est mise à jour correctement à partir du service WCF. Le problème est que la classe DateSelector, dont la propriété 'paires' est liée à 'dates', n'est pas mise à jour. À moins que je ne sois mal compris, les données DataContract/DataMember sont utilisées dans le WebService pour faciliter la sérialisation. Il n'y a pas de sérialisation entre les UserControls dans mon application. – Klay

+0

Le problème est-il que l'événement NotifyPropertyChanged n'est pas lancé? Si oui, la réponse d'Anthony ci-dessous résout ce problème. –

0

Ce qui est en fait est que l'wierd autre Les choses fonctionnent quand vous avez codé votre classe comme vous l'avez fait. Je suppose que le tableau dates est défini par un code qui s'exécute en interne dans votre gestionnaire de sélection à la fin d'une requête WCF. Howerver alors que vous avez implémenté INotifyPropertyChanged, vous ne déclenchez pas réellement l'événement qu'il définit. Vous ne pouvez pas vraiment combiner INotifyPropertyChanged avec la syntaxe C# de la propriété Auto. Vous avez besoin de ceci: -

public SelectionManager : INotifyPropertyChanged 
{ 
    private DQMServiceDateCountPair[] myDates; 
    public DQMServiceDateCountPair[] dates 
    { 
    get { return myDates; } 
    set 
    { 
     myDates = value; 
     NotifyPropertyChanged("dates"); 
    } 
    // rest of your code 
} 
+0

En fait, je lève l'événement dans le rappel de l'appel de service WCF lorsqu'il définit la propriété 'dates' - j'ai juste oublié d'inclure ce bit de code. J'ai maintenant réécrit mon code à ce que vous avez ci-dessus. Ne met toujours pas à jour la cible de liaison. – Klay