как правильно использовать CoerceValueCallback в пользовательском контроле пользователя WPF - PullRequest
1 голос
/ 27 июля 2011

Я создал пользовательский элемент управления, другие члены моей команды просто размещают его на своем виде, и они могут затем динамически создавать коллекцию кнопок ObservrableCollection и привязываться к ней (ленточная панель, но сильно настраиваемая в соответствии с нашими потребностями), она обрабатывает ее размещение, стиль и т. д. Он работает просто отлично и полностью соответствует потребностям нашего проекта, однако он работает только при начальной загрузке, я немного покопался и понял, что это потому, что у меня был только PropertyChangedCallback в FrameWorkMetaData, и я не настроил обратный вызов для 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 Ответ

1 голос
/ 27 июля 2011

Я не думаю, что вам нужно использовать 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, чтобы определить, как изменилась коллекция, и внести минимальные изменения в кнопки. Или вы можете просто полностью перестроить их каждый раз.

...