Привязка Silverlight в DataGridRowGroupHeader не обновляется при изменении источника данных - PullRequest
2 голосов
/ 18 октября 2010

У меня есть привязка во встроенном стиле для DataGridRowGroupHeader, подобная этой.

<sdk:DataGrid.RowGroupHeaderStyles>
     <Style TargetType="sdk:DataGridRowGroupHeader">
        <Setter Property="Template">
     <Setter.Value>
             <ControlTemplate TargetType="sdk:DataGridRowGroupHeader">
                           <TextBlock Margin="4,0,0,0" Text="{Binding Converter={StaticResource headerConverter}}" />

Источник DataGrid привязан к PageCollectionView, содержащему наблюдаемую коллекцию, которая сгруппирована по свойству в коллекции.Когда я обновляю коллекцию, строки сетки изменяются, но привязка в GroupHeader не изменяется.

Есть ли другой способ привязать это или способ принудительно обновить пользовательский интерфейс?

Это конвертер, который я использую для привязки заголовка:

 public class GroupHeaderConverter2 : IValueConverter {

public object Convert(object value, System.Type targetType, object parameter, CultureInfo culture) {
var cvg = value as CollectionViewGroup;

return string.Format("({0} Remaining)", cvg.Items.Count((i) => ((CheckListEventDefinition)i).Complete == false && ((CheckListEventDefinition)i).Required == true));
}

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

}

Получил это, изменив исходную коллекцию на мою собственную расширенную ObservableCollection, которая также контролирует элементыдля PropertyChanged, а затем вызывает событие CollectionChanged.

/// <summary> this collection is also monitoring the elements for changes so when PropertyChanged fires on any element, it will raise the CollectionChanged event</summary>
public class ObservableCollectionEx<T> : ObservableCollection<T> where T : INotifyPropertyChanged {

    public ObservableCollectionEx(ObservableCollection<T> regularCollection) {
        if (regularCollection != null) {
            foreach (var item in regularCollection) {
                this.Add(item);
            }
        }
    }

    public void RaiseCollectionChanged() {
        this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
    }

    protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e) {
        Unsubscribe(e.OldItems);
        Subscribe(e.NewItems);
        base.OnCollectionChanged(e);
    }

    protected override void ClearItems() {
        foreach (T element in this)
            element.PropertyChanged -= handlePropertyChanged;

        base.ClearItems();
    }

    private void Subscribe(IList iList) {
        if (iList == null) return;
        foreach (T element in iList)
            element.PropertyChanged += handlePropertyChanged;
    }

    private void Unsubscribe(IList iList) {
        if (iList == null) return;
        foreach (T element in iList)
            element.PropertyChanged -= handlePropertyChanged;
    }

    private void handlePropertyChanged(object sender, PropertyChangedEventArgs e) {
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
    }
}

Ответы [ 2 ]

0 голосов
/ 29 апреля 2013

Стефан

Я следую вашему решению с разницей: - я использую параметр - я использую ячейку данных

но когда я изменяю свой источник данных, заголовок группы данных не меняется. <data:DataGridCell Content="{Binding Items,Converter={StaticResource myConverterBnc}, ConverterParameter=Fattura,UpdateSourceTrigger=PropertyChanged}" Foreground="White" Width="113"/>

0 голосов
/ 19 октября 2010

Проблема в том, что вы привязываетесь непосредственно к объекту, а не к свойству с Path.Если вы связываете без Path, привязка никогда не будет обновляться, потому что нет события PropertyChanged, чтобы уведомить пользовательский интерфейс об изменении привязки.Самое простое изменение - изменить привязку на {Binding Items, Converter={StaticResource headerConverter}}, а затем привести значение в конвертере непосредственно к ReadOnlyObservableCollection<object>.

Если вам нужна большая гибкость, то, я думаю, вам придется реализовать собственную ICollectionViewс кастомом CollectionViewGroup.

...