2015-01-17 3 views
1

Я привязал свою сетку данных и кучу флажков к следующим свойствам в моей модели просмотра (напечатано Presenter).Gridview не обновляется при изменении связанных данных

public ListCollectionView AllOrdersView { get; set; } 

public IEnumerable<CarrierType> AllCarrierTypes 
{ 
    get { return _allCarrierTypes; } 
    set 
    { 
    _allCarrierTypes = value; 
    OnPropertyChanged(); 
    } 
} 

В его конструкторе я назначаю фильтр таким образом.

public Presenter() 
{ 
    _allOrders = new ObservableCollection<Order>(DataAccessor.GetOrders()); 
    AllOrdersView = new ListCollectionView(_allOrders); 
    AllOrdersView.Filter = element => AllCarrierTypes 
    .Where(x => x.Active).Contains(((Order)element).CarrierType); 
} 

Цель состоит в том, чтобы отфильтровать заказы, у которых есть несущий тип, который не установлен. На данный момент кажется, что фильтрация происходит только изначально, когда вызывается конструктор. Я надеюсь, что, поскольку флажки привязаны, мне больше не нужно вмешаться в код. Это не так. Когда я выбираю/снимаю флажки, сетка данных остается неизменной.

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

private void ToggleButton_OnUnchecked(Object sender, RoutedEventArgs eventArgs) 
{ 
    ((Presenter)DataContext).AllOrdersView.Refresh(); 
} 

К сожалению, это не имеет никакого значения, и я все застрял. Итак, мои вопросы таковы.

  1. Нужно ли явно обновлять обработчик событий?
  2. Нужно ли мне добавить другое (вид) переплет?
  3. Нужно ли мне реализовать что-либо еще в модели представления?

Мои привязки выполняются следующим образом.

<ListBox ItemsSource="{Binding AllCarrierTypes}"> 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <CheckBox Content="{Binding Name}" 
       IsChecked="{Binding Active,Mode=TwoWay}" 
       Checked="ToggleButton_OnChecked" 
       Unchecked="ToggleButton_OnUnchecked"/> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

<DataGrid x:Name="dataGrid" 
      ItemsSource="{Binding AllOrdersView}" 
      AutoGeneratingColumn="DataGrid_OnAutoGeneratingColumn" .../> 

Редактировать

Per - запроса на полную версию CarrierType класса в модели.

public class CarrierType : INotifyPropertyChanged 
{ 
    private bool _active; 

    public int Id { get; set; } 
    public String Name { get; set; } 
    public bool Active 
    { 
    get { return _active; } 
    set 
    { 
     _active = value; 
     OnPropertyChanged(); 
    } 
    } 

    public override String ToString() 
    { 
    return Name; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    [NotifyPropertyChangedInvocator] 
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

ответ

1

Там, кажется, проблема с ListCollectionView в .NET 4.5 (не уверен, если проблема существовала ранее). Вам нужно будет позвонить Обновить(), но он не работает.

Что я делаю, это переустановка фильтра.

private void ToggleButton_OnUnchecked(Object sender, RoutedEventArgs eventArgs) 
{ 
    AllOrdersView.Filter = element => AllCarrierTypes 
    .Where(x => x.Active).Contains(((Order)element).CarrierType); 
} 

В соответствии с просьбой в комментариях ниже:

<CheckBox IsChecked="{Binding Active,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/> 
+0

У вас есть ссылка на какой-то документации об этом? Есть ли еще какой-нибудь способ обходить его? Есть ли вероятность, что это ** предназначено для поведения и что мы просто злоупотребляем им? Кроме того, я замечаю, что вы пропустили часть, ссылающуюся на экземпляр модели представления через * DataContext *. Это возможно? Я всегда просматриваю это, бросаю, а потом ссылаюсь на него, что неудобно. –

+1

Я не знаю ... давайте проверим msdn для Refresh() .. –

+0

MSDN: «Восстанавливает представление». –