Как смешивать столбцы Silverlight DataGrid с привязкой и без нее? - PullRequest
2 голосов
/ 06 октября 2011

В Silverlight 4 у меня есть DataGrid, который связан с RIA DomainDataSource, все сделано в XAML. Свойство AutoGenerateColumns имеет значение false, и каждый столбец определяется и связывается вручную. В основном это работает нормально.

Там, где я сейчас сталкиваюсь с проблемами, есть дополнительный DataGridTextColumn, который не имеет привязки. Я хочу вручную заполнить ячейки в этом столбце в коде позади. При наличии этого столбца без привязки во время выполнения появляется следующее исключение:

<sup>System.ArgumentNullException: Value cannot be null.
Parameter name: binding
   at System.Windows.Data.BindingOperations.SetBinding(DependencyObject target, DependencyProperty dp, BindingBase binding)
   at System.Windows.Controls.DataGridTextColumn.GenerateElement(DataGridCell cell, Object dataItem)
   at System.Windows.Controls.DataGrid.PopulateCellContent(Boolean isCellEdited, DataGridColumn dataGridColumn, DataGridRow dataGridRow, DataGridCell dataGridCell)
   at System.Windows.Controls.DataGrid.AddNewCellPrivate(DataGridRow row, DataGridColumn column)
   at System.Windows.Controls.DataGrid.CompleteCellsCollection(DataGridRow dataGridRow)
   at System.Windows.Controls.DataGrid.GenerateRow(Int32 rowIndex, Int32 slot, Object dataContext)
   at System.Windows.Controls.DataGrid.AddSlots(Int32 totalSlots)
   at System.Windows.Controls.DataGrid.RefreshRows(Boolean recycleRows, Boolean clearRows)
   at System.Windows.Controls.DataGrid.RefreshRowsAndColumns(Boolean clearRows)
   at System.Windows.Controls.DataGrid.InitializeElements(Boolean recycleRows)
   at System.Windows.Controls.DataGridDataConnection.NotifyingDataSource_CollectionChanged(Object sender, NotifyCollectionChangedEventArgs e)
   at System.Windows.Controls.DomainDataSourceView.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
   at System.Windows.Controls.DomainDataSourceView.OnCollectionViewCollectionChanged(Object sender, NotifyCollectionChangedEventArgs e)
   at System.Windows.Controls.EntityCollectionView.OnCollectionChanged(NotifyCollectionChangedEventArgs args)
   at System.Windows.Controls.PagedEntityCollectionView.OnCollectionChanged(NotifyCollectionChangedEventArgs args)
   at System.Windows.Controls.PagedEntityCollectionView.RefreshView()
   at System.Windows.Controls.PagedEntityCollectionView.SourceCollectionChanged(NotifyCollectionChangedEventArgs args)
   at System.Windows.Controls.EntityCollectionView.HandleSourceCollectionChanged(Object sender, NotifyCollectionChangedEventArgs e)
   at System.Windows.Controls.PagedEntityCollection.RaiseCollectionChanged(NotifyCollectionChangedAction action, Entity entity, Int32 index)
   at System.Windows.Controls.PagedEntityCollection.CompleteLoad()
   at System.Windows.Controls.DomainDataSource.ProcessLoadedEntities(LoadContext loadContext, IEnumerable`1 entities)
   at System.Windows.Controls.DomainDataSource.DomainContext_Loaded(LoadedDataEventArgs e, LoadContext loadContext)</sup>

Как я могу избежать этого исключения и иметь мою DataGrid с большинством столбцов, связанных и один столбец без привязок?

Заранее спасибо.

Изменить:

Мой XAML выглядит следующим образом:

    <sdk:DataGrid AutoGenerateColumns="False"
        ItemsSource="{Binding Data, ElementName=MyDomainDataSource, Mode=OneWay}">
        <sdk:DataGrid.Columns>
            <sdk:DataGridTextColumn Binding="{Binding Name}" Header="Name" />
            <sdk:DataGridTextColumn Binding="{Binding CreationDate}" Header="Creation Date" />
            <sdk:DataGridTextColumn Header="Unbound Col" />
        </sdk:DataGrid.Columns>
    </sdk:DataGrid>

Редактировать # 2:

Одна идея, которую я нашел в Интернете, состояла в том, чтобы связать последний столбец с каким-то уникальным значением (у меня есть идентификатор в моей модели данных) и использовать пользовательский IValueConverter, который преобразует идентификатор в зависимое значение. Это было бы именно то, что я хотел, но, к сожалению, я получаю зависимое значение от вызова службы WCF, который всегда асинхронный. Поскольку вы не можете использовать вызовы асинхронных методов в IValueConverter, это решение не подходит для меня.

1 Ответ

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

Рассматривали ли вы вместо этого использование DataGridTemplateColumn? Неважно, если вы установили привязку или нет для этого типа столбца.

Например, если вы просто хотите установить несвязанное значение один раз во время загрузки, вы можете сделать что-то вроде этого:

                    <sdk:DataGridTemplateColumn>
                        <sdk:DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox x:Name="MyText" Loaded="MyText_Loaded"></TextBox>
                            </DataTemplate>
                        </sdk:DataGridTemplateColumn.CellTemplate>
                    </sdk:DataGridTemplateColumn>

... и затем установите значение в коде так:

    private void MyText_Loaded(object sender, RoutedEventArgs e)
    {
        var textBox = sender as TextBox;
        if (textBox != null) textBox.Text = "My one off text"; 
    }

Я не уверен, каковы ваши точные требования.

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