2009-11-09 79 views
1

有人請幫助我理解了爲什麼這種結合不工作...Silverlight 3中收集結合

我有一個名爲SelectionManager用一種叫做由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中更新我的所有其他綁定正確,包括於「日期」組合框。但是,我的用戶控件不會更新。 Debug.Writeline不會在'pairs'屬性的set語句中調用。

在玩弄它,我已經嘗試使DQMServiceDateCountPair []屬性成爲ObservableCollection並實現INotifyCollectionChanged,但這並沒有幫助。

如果我將源屬性或目標屬性作爲數組離開,並將另一個作爲ObservableCollection,那麼我得到一個綁定錯誤,表示它不能自動將其轉換爲另一個,所以Silverlight似乎意識到綁定,它只是不更新​​它。

任何人都可以幫忙嗎?

P.S.我使用Silverlight 3

回答

0

所以,這是什麼發生了什麼。這個綁定在整個過程中一直很好。在過去的一週裏,我一直在爲此苦苦掙扎,它一直在愉快地更新 - 但由於我的錯誤假設,我永遠無法看到它。

萬一別人懷有這種錯誤的假設,讓我講出來:

的的GetValue和的SetValue調用不能憑藉的事實,你宣佈一個依賴屬性自動進行。聲明的「新PropertyMetadata()」部分有一個需要回調方法的重載。在這個回調方法中,你必須自己設置屬性值。舉例來說,在我的代碼,我做了這個PropertyMetadata電話:

new PropertyMetadata(new PropertyChangedCallback(OnPairsPropertyChanged)) 

和回調方法讀取這樣的:

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

謝謝大家誰試圖幫助!

0

試着改變你的代碼如下:
1.添加數據成員/ 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)); } 
    } 
+0

我想你可能會誤解這個問題。 SelectionManager類正在從WCF服務正確更新。問題是DateSelector類的屬性'pairs'綁定到'日期',不會更新。 除非我誤解,DataContract/DataMember的東西在WebService中使用,以促進序列化。我的應用程序中的用戶控件之間沒有序列化。 – Klay 2009-11-09 21:07:15

+0

問題是NotifyPropertyChanged事件沒有被拋出?如果是這樣,安東尼的答案在下面解決這個問題。 – 2009-11-10 10:04:57

0

請告訴我真正奇怪的是,其他當你按照你的方式編寫你的課程時,這些東西正在工作。我的猜測是,dates數組是通過一些在完成WCF請求時在選擇管理器內部運行的代碼來設置的。

Howerver,雖然你已經實現INotifyPropertyChanged你實際上並沒有提高它定義的事件。您無法真正將INotifyPropertyChanged與Auto-property C#語法結合使用。你需要這個: -

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

實際上,當它設置'日期'屬性時,我從WCF服務調用的回調中引發事件 - 只是忘記包含該位代碼。我現在已經將我的代碼重寫爲上面的內容。仍然不更新綁定目標。 – Klay 2009-11-10 13:56:02