2011-12-08 14 views
0

ObservableCollectionsの新機能ですが、動作するはずのコードを作成しました。残念ながらそれはしません。起こっていない唯一のことは、私のGUIが更新されていないことです。私は、値が(デバッガを使ってチェックされた)バックで更新されていることを知っています。SilverlightのUIが更新されない - ObservableCollectionが再インスタンス化される

私は間違っていますか?後ろの私のコードの

<TextBlock Name="tbCallsOpen" Text="{Binding IndicatorValue}" /> 

これによりサンプル:TextBlockのための私のXAMLのサンプルとここ

public partial class CurrentCalls : UserControl 
{ 
    Microsoft.SharePoint.Client.ListItemCollection spListItems; 
    ObservableCollection<CurrentCallIndicator> CallIndicators = new ObservableCollection<CurrentCallIndicator>();   

    public CurrentCalls() 
    {    
     InitializeComponent(); 

     DispatcherTimer dispatchTimer = new DispatcherTimer(); 
     dispatchTimer.Interval = new TimeSpan(0, 0, 20); 
     dispatchTimer.Tick += new EventHandler(BindData); 
     dispatchTimer.Start(); 
    } 

    private void BindData(object sender, EventArgs args) 
    { 
     //splistitems is a sharepoint list. Data is being retrieved succesfully, no issues here. 
     foreach (var item in spListItems) 
     { 
      //My custom class which implements INotifyPropertyChanged 
      CurrentCallIndicator indicator = new CurrentCallIndicator(); 
      indicator.IndicatorValue = item["MyValueColumn"]; 

      //Adding to ObservableCollection 
      CallIndicators.Add(indicator); 

     } 
     //Setting Datacontext of a normal TextBlock 
     tbCallsOpen.DataContext = CallIndicators.First(z => z.IndicatorName == "somevalue"); 
    } 
} 

答えて

2

あなたが最も可能性が高いと想定されるコレクション内の基礎となる項目への変更CollectionChangedイベントが発生します。しかし、それはObservableCollection<T>の仕組みではありません。

あなたが自分のインプリメントをロールバックする必要があり、コレクション内のアイテム内でPropertyChangedイベントが発生した場合は、CollectionChangedイベントを発生させる必要があります。

+0

これで、ObservableCollectionのCollectionChangedイベントにバインドされたことが追加されました。ただし値は更新されますが、コントロールはありません。 – Fox

+0

DispatchTimerなどの不要なコードをすべて削除し、動作するかどうかを確認します。それを絞り込む必要があります。出力ウィンドウを確認することもできます。 –

1

あなたのコードは、あなたが期待していると思われる結果を得るために、ObservableCollection <>を使用する必要があるとは思っていませんが、 <>はうまく動作します。

DataContextが予想されるアイテムに正しく更新されていることをデバッガから通知された場合、最も可能性の高い問題は、バインディングの定義方法に問題があることです。あなたのデバッグウィンドウに報告されているバインディングエラーが表示されない場合は、Be Stollnitzの記事debugging bindingsを参照してください。最も具体的には、私は頻繁に彼女が「DebugValueConverter」の示唆技術、例えば:

/// <summary> 
/// Helps to debug bindings. Use like this: Content="{Binding PropertyName, Converter={StaticResource debugConverter}}" 
/// </summary> 
public class DebugConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return value; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return value; 
    } 
} 

を使用し、あなたのコンバータにブレークポイントを設定し、何が起こっているかを見ます。これはハックとクルージングですが、SL5(バインディングデバッグが組み込まれています)になるまでは、それが最善の策です。

0

Ok、ソート済み。私は自分自身で問題を解決しました。ループ内の値を更新していたため、ObservableCollectionが正しく更新されていませんでした。私がデータバインディングメソッドの始めに行ったのは、コレクションをクリアすることでした:CallIndicators.Clear();

関連する問題