Как правильно настроить элемент управления DXGrid, когда DataBound - PullRequest
1 голос
/ 30 июня 2011

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

Для иллюстрации - вот мое заявление в исходном состоянии:

Empty Grid

Когда я добавляю четыре новых объекта в свой базовый список, меняется только полоса прокрутки:

Scrollbar Changes

Наконец, когда я нажимаю кнопку «вниз» внизу полосы прокрутки, вся сетка обновляется:

Refreshed Grid

Ожидаемое поведение: сетка должна корректно обновляться всякий раз, когда обновляется базовый список баз данных, не намного позже, когда пользователь пытается взаимодействовать со списком.

Xaml для моего GridControl выглядит так:

    <dxg:GridControl dxlc:DockLayoutControl.Dock="Client" 
                     ItemsSource="{Binding Project.TimeSeries}">

        <dxg:GridControl.Columns>
            ... omitted ...
        </dxg:GridControl.Columns>
        <dxg:GridControl.View>
            <dxg:TableView Name="tableView1"
                           AllowEditing="False"
                           AllowColumnFiltering="True"
                           ShowAutoFilterRow="True"
                           ShowGroupPanel="False" 
                           FocusedRow="{Binding SelectedTimeSeries, Mode=TwoWay}"/>
        </dxg:GridControl.View>
    </dxg:GridControl>

DataContext формы имеет значение TimeSeriesPresenter:

public class TimeSeriesPresenter : ITimeSeriesPresenter
{
    public TimeSeriesPresenter(ITimeSeriesVisual view)
        : base(view) { ... }

    public BuilderProject Project 
        { get { ... } set { ... } }

    public TimeSeriesDefinition SelectedTimeSeries 
        { get { ... } set { ... } }

и BuilderProject выглядит так:

public class BuilderProject : ViewModelBase
{
    public IList<TimeSeriesDefinition> TimeSeries
    { get { ... } }
    ...
}

Оба эти объекта реализуют INotifyPropertyChanged, и свойства правильно запускают событие PropertyChanged. Итак, все должно просто работать, верно?

Очевидно, что DXGrid получает какое-то обновление от модели представления, потому что полоса прокрутки изменяется. Но почему он не перекрашивается полностью?

Существует ли какой-то "режим", необходимый для DXGrid, чтобы нормально выполнять привязку данных? Чего мне не хватает?

Обновление

Все мои объекты данных наследуются от ViewModelBase, который реализует интерфейс INotifyPropertyChanged. В дополнение к TimeSeriesPresenter и BuilderProject (показано выше), вот сводка TimeSeriesDefinition:

public class TimeSeriesDefinition : ViewModelBase
{
    public string SeriesID
    {
        get { return mSeries; }
        set { 
            if (!Equals(mSeries, value) {
                mSeries = value;
                OnPropertyChanged("SeriesID");
            }
        }
    }
    ... etc ...
}

Ответы [ 2 ]

1 голос
/ 06 сентября 2011

Источником проблемы был этот код:

public class BuilderProject : ViewModelBase
{
    public IList<TimeSeriesDefinition> TimeSeries
    { get { ... } }
    ...
}

Даже если IList<T> следует поддерживать, на практике это не так.

Необходимое исправление было заменено на ObservableCollection<T>:

public class BuilderProject : ViewModelBase
{
    public ObservableCollection<TimeSeriesDefinition> TimeSeries
    { get { ... } }
    ...
}

В моем случае это привело к параллельному ведению двух списков - базового IList<> в модели, не зависящей от представления, и ObservableCollection<> в ViewModel. Синхронизация двух списков - это немного сложная задача, но не трудно понять, как правильно.

1 голос
/ 30 июня 2011

Позвольте мне добавить дополнительную информацию.Вы сказали, что ViewModel и DataSource реализуют интерфейс INotifyPropertyChanged.Я прав в своем предположении, что объект данных не реализует этот интерфейс?Если это так, я склонен думать, что это является причиной этой проблемы.
Если класс объектов данных (TimeSeriesDefinition?) Реализует этот интерфейс, все должно работать правильно.

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

FieldName = "Row.Text"

Если это так,пожалуйста, дайте мне знать, и мы дадим вам знать, как решить проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...