Как перезагрузить DataContext? - PullRequest
2 голосов
/ 26 октября 2010

У меня есть Silverlight Business Aplication (службы RIA), и у меня есть DataGrid, присоединенный к DataContext DataSource.В дочерней Windows Silverlight я создаю новый объект и отправляю изменения на сервер.Проблема в том, что мой DataContext не знает об этом, поэтому сетка не показывает вновь добавленную сущность.

Как обновить DataContext или сказать DataGrid для повторной привязки?

Редактировать: Вот мой код

<riaControls:DomainDataSource AutoLoad="True" d:DesignData="{d:DesignInstance my:Team, CreateList=true}" Height="0" LoadedData="teamDomainDataSource_LoadedData" Name="teamDomainDataSource" QueryName="GetTeamsQuery" Width="0">
        <riaControls:DomainDataSource.DomainContext>
            <my:F1DomainContext />
        </riaControls:DomainDataSource.DomainContext>
</riaControls:DomainDataSource>

<sdk:DataGrid AutoGenerateColumns="False" Height="200" ItemsSource="{Binding ElementName=teamDomainDataSource, Path=Data}" Name="teamDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" DataContext="{Binding}">
                    <sdk:DataGrid.Columns>
                        <sdk:DataGridTextColumn x:Name="idColumn" Binding="{Binding Path=Id, Mode=OneWay}" Header="Id" IsReadOnly="True" Width="SizeToHeader" />
                        <sdk:DataGridTextColumn x:Name="nameColumn" Binding="{Binding Path=Name}" Header="Name" Width="SizeToHeader" />
                    </sdk:DataGrid.Columns>
</sdk:DataGrid>

Как видите, мой teamDataGrid 's ItemSource - это teamDomainDataSource, определенный выше

Ответы [ 4 ]

1 голос
/ 01 мая 2011

Это старый вопрос, но у меня была похожая проблема, и я обнаружил, что CanLoad был ложным.Изучив это с помощью Reflector, я обнаружил, что это устанавливается только в том случае, если контекст домена изменяется или в настоящий момент сохраняется или загружается (что было в моем случае).

Из класса DomainDataSource

private void UpdateCanLoadProperty()
{
    this.CanLoad = !this.IsSubmittingChanges && !this.HasChanges;
    if (this.HasChanges && this.IsLoadingData)
    {
        this.CancelLoadPrivate();
    }
}

И в методе загрузки вы можете увидеть, как выдается полученная ошибка:

public void Load()
{
    if (!DesignerProperties.IsInDesignTool)
    {
        if (this.DomainContext == null)
        {
            throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, DomainDataSourceResources.OperationNeedsPropertySet, new object[] { "DomainContext", DomainDataSourceResources.LoadOperation }));
        }
        if (string.IsNullOrEmpty(this.QueryName))
        {
            throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, DomainDataSourceResources.OperationNeedsPropertySet, new object[] { "QueryName", DomainDataSourceResources.LoadOperation }));
        }
        if (this._loadDeferLevel > 0)
        {
            throw new InvalidOperationException(DomainDataSourceResources.LoadWithinDeferLoad);
        }
        this.ValidateQueryParameters();
        if (this._preparingOperation)
        {
            throw new InvalidOperationException(DomainDataSourceResources.InvalidOperationDuringLoadOrSubmit);
        }
        if (!this.CanLoad)
        {
            throw new InvalidOperationException(DomainDataSourceResources.CannotLoadWhenCanLoadIsFalse);
        }
        this.ExecuteLoad(this.InitialLoadType);
    }
}

Чтобы устранить эту ошибку, вам необходимо отправить свои изменения (или отклонить их, в зависимости от того, что правильно).Если вы отправляете свои изменения с помощью метода SubmitChanges, вы обнаружите, что он содержит перегрузку, принимающую обратный вызов, из которого вы хотите вызвать метод Load.По сути, вы не можете вызвать load, когда есть изменения.

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

Ваши два лучших варианта: либо (1) перезагрузить DDS с помощью DomainDataSource.Load (), чтобы получить самые последние данные, либо (2) добавить объект через DDS перед отправкой его с помощью DomainDataSource.DataView.Add ().

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

Итак, после предложения @Kyle я получил следующую ошибку:

Операция загрузки не может быть выполнена, когда CanLoad имеет значение false. Элементы управления, которые вызывают операции загрузки, должны быть отключены, когда CanLoad имеет значение false

Так что я погуглил и нашел этот пост , который показал "не слишком красивый" способ обойти это ... но он делает свое дело.

Так вот как я это исправил ...

teamDataGrid.ItemsSource = null;
teamDataGrid.ItemsSource = ((F1DomainContext)teamDomainDataSource.DomainContext).Teams;

Так что я сделал, привязав источник данных к моей сетке ... кто-нибудь знает более красивый способ?

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

Убедитесь, что «Список» вашего Datagrid имеет тип: ObservableCollection.Простота реализации и позволяет получать такие уведомления.

Дайте мне знать, если вам нужна дополнительная помощь.

...