2011-07-27 15 views
1

私はユーザーコントロールを作成しました。私のチームの他のメンバーは単にそのビューに配置し、ボタンのObservrableCollectionを動的に作成してバインドすることができます私たちのニーズに高度にカスタマイズされています)、配置やスタイルなどを処理します。これはうまく動作し、プロジェクトの必要性に完全に適合しますが、初期ロード時にのみ機能します。 FrameWorkMetaDataでCoerceValueCallbackのコールバックを設定していないので、掘り下げて設定しましたが、何をすべきかはわかりません。ここでは、CoerceValueCallbackのメソッドシグネチャが返されますオブジェクトと私はちょうどリストが変更されたときに私のボタンを更新したい。この戻り値を無視するのは安全ですか?たぶん、いくつかのコードは役立つかもしれない -カスタムWPFユーザーコントロールでCoerceValueCallbackを有効に使用する方法

をここに私のPropertyChangedCallbackある - トリガーされます彼らは最初んが、ここでボタン

public static void ButtonListUpdated(DependencyObject source, DependencyPropertyChangedEventArgs e) 
{ 
    int count = 0; 
    var grid = (source as RibbonBarUserControl).ButtonsGrid; 
    var buttons = e.NewValue as ObservableCollection<Button>; 
    if (buttons != null) 
    { 
    grid.Children.Clear(); 
    foreach (RibbonButton b in buttons) 
    { 
     b.Margin = new Thickness(1); 
     b.Style = (Style)grid.FindResource("ribbonButtonStyle"); 
     ColumnDefinition c = new ColumnDefinition(); 
     grid.ColumnDefinitions.Add(c); 
     grid.Children.Add(b); 
     Grid.SetRow(b, 0); 
     Grid.SetColumn(b, count); 
     count = ++count; 
    } 
    } 
} 

のリストを割り当てないときにいるCoerceValueCallback

public static object OnButtonListModified(DependencyObject sender, Object baseValue) 
{ 
    //What to do here? Can I essentially ignore the returned object and basically 
    //copy what I am doing in ButtonListUpdated? 
    return baseValue; 
} 

である私は、オンラインでいくつかの例を見て、彼らははるかにシンプルなところ - 誕生日が結婚年誕生日よりも短いように=結婚年、コースこれは少し違う - 私はボタンを作成し、私のコントロールのUIを更新しています。

OK - ご意見ありがとうございます。

答えて

1

私はCoerceValueCallbackを使用する必要はないと思います。代わりに、あなたのコレクションのCollectionChangedイベントにフックして、ボタンがリリースされたら更新してください。

だから、のようなもの:あなたはまた、コレクションがどのように変化するかを決定するためにNotifyCollectionChangedEventArgsのメンバーを使用し、ボタンに最小限の変更を加えることができ

public static void ButtonListUpdated(DependencyObject source, DependencyPropertyChangedEventArgs e) 
{ 
    var control = source as RibbonBarUserControl; 
    var buttons = e.OldValue as ObservableCollection<Button>; 
    if (buttons != null) 
     buttons.CollectionChanged -= control.OnCollectionChanged; 

    buttons = e.NewValue as ObservableCollection<Button>; 
    if (buttons != null) 
     buttons.CollectionChanged += control.OnCollectionChanged; 

    control.UpdateButtons(); 
} 

private void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    this.UpdateButtons(); 
} 

private void UpdateButtons() { 
    // TODO: Update buttons 
} 

。あるいは、毎回完全に再構築することもできます。

+0

忍者!ありがとうございました - 私は間違った木を吠えていました - あなたがそれを指摘したのでそれはとても分かります。 – Kenn

関連する問題