Я привязал свою сетку данных и кучу флажков к следующим свойствам в моей модели просмотра (напечатано 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();
}
К сожалению, это не имеет никакого значения, и я все застрял. Итак, мои вопросы таковы.
- Нужно ли явно обновлять обработчик событий?
- Нужно ли мне добавить другое (вид) переплет?
- Нужно ли мне реализовать что-либо еще в модели представления?
Мои привязки выполняются следующим образом.
<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));
}
}
У вас есть ссылка на какой-то документации об этом? Есть ли еще какой-нибудь способ обходить его? Есть ли вероятность, что это ** предназначено для поведения и что мы просто злоупотребляем им? Кроме того, я замечаю, что вы пропустили часть, ссылающуюся на экземпляр модели представления через * DataContext *. Это возможно? Я всегда просматриваю это, бросаю, а потом ссылаюсь на него, что неудобно. –
Я не знаю ... давайте проверим msdn для Refresh() .. –
MSDN: «Восстанавливает представление». –