Как я обновляю IValueConverter на CollectionChanged?

Я в значительной степени только использую это при ссылке на свойство типа из того же типа. Как другой пользователь упомянул, я также подчеркиваю локальные поля, таким образом, они примечательны, не нуждаясь это .

5
задан Bryan Anderson 4 November 2009 в 18:14
поделиться

2 ответа

В итоге я сделал что-то вроде этого, что, кажется, работает. Это далеко не оптимальное решение, и мне все равно было бы интересно что-нибудь получше, но, похоже, оно работает для моих целей.

class CollectionChangedHandlingValueConverter : IValueConverter
{
    DependencyObject myTarget;
    DependencyProperty myTargetProperty;

    //If this ever needs to be called from XAML you can make it a MarkupExtension and use ProvideValue to set up the Target and TargetProperty
    public CollectionChangedHandlingValueConverter(DependencyObject target, DependencyProperty dp)
    {
        myTarget = target;
        myTargetProperty = dp;
    }

    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        INotifyCollectionChanged collection = value as INotifyCollectionChanged;
        if (collection != null)
        {
            //It notifies of collection changed, try again when it changes
            collection.CollectionChanged += DataCollectionChanged;
        }

        //Do whatever conversions here
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion

    void DataCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if ((myTarget != null) && (myTargetProperty != null))
        {
            BindingOperations.GetBindingExpressionBase(myTarget, myTargetProperty).UpdateTarget();
        }
    }
}
3
ответ дан 14 December 2019 в 08:53
поделиться

На самом деле это на удивление очень сложно. IValueConverter не обновляется, поэтому он не работает так, как вы надеялись.

Я написал образец в галерее выражений Microsoft под названием Collection Aggregator , который показывает работающий, хотя и запутанный, подход к созданию эта работа выполняется с помощью Behavior, которое выполняет агрегирование (Count, в вашем случае, хотя я также поддерживаю Sum, Average и т. д.) вместо конвертера.

2
ответ дан 14 December 2019 в 08:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: