如何在自定义WPF用户控件中正确使用CoerceValueCallback

时间:2011-07-27 13:45:45

标签: c# wpf dependency-properties

我已经创建了一个用户控件,我的团队的其他成员只是将它放在他们的视图上,然后他们可以动态创建一个ObservrableCollection按钮并绑定到它(一个功能区栏,但根据我们的需要高度定制),它处理放置,样式等。它工作得很好,完全符合我们项目的需要,但它只适用于初始加载,我做了一些挖掘,并意识到这是因为我在FrameWorkMetaData中只有一个PropertyChangedCallback而我没有设置CoerceValueCallback的回调所以我做了一些挖掘并设置了一个,但我不确定该做什么 - 我想这是问题,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;
}

我在网上看到了一些例子,它们更简单 - 比如生日少于结婚年生日=结婚年,当然这有点不同 - 我正在创建按钮并更新我的控制界面。

好的 - 谢谢你的任何建议!

1 个答案:

答案 0 :(得分:1)

我认为你不需要使用CoerceValueCallback。相反,您应该挂钩集合的CollectionChanged事件,并在触发时更新按钮。

类似于:

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
}

您还可以使用NotifyCollectionChangedEventArgs的成员来确定集合的更改方式,并对按钮进行最少的更改。或者你可以每次完全重建它们。