#silverlight #silverlight-4.0 #datagrid
#silverlight #silverlight-4.0 #datagrid
Вопрос:
В Silverlight 4 у меня есть DataGrid, который привязан к источнику RIA DomainDataSource, все сделано в XAML. AutoGenerateColumns
Свойство устанавливается false
равным, и каждый столбец определяется и привязывается вручную. В принципе, это работает нормально.
Где я сейчас сталкиваюсь с проблемами, так это наличие дополнительного DataGridTextColumn
, который не имеет привязки. Я хочу вручную заполнить ячейки в этом столбце в приведенном ниже коде. При наличии этого столбца без привязки во время выполнения появляется следующее исключение:
Система.Исключение ArgumentNullException: значение не может быть нулевым. Имя параметра: привязка в системе.Операции Windows.Data.Binding.SetBinding(DependencyObject target, DependencyProperty dp, привязка BindingBase) в системе.Windows.Элементы управления.DataGridTextColumn.GenerateElement(ячейка DataGridCell, элемент данных объекта) в системе.Windows.Элементы управления.DataGrid.PopulateCellContent(Boolean isCellEdited, DataGridColumn DataGridColumn, DataGridRow DataGridRow, DataGridCell DataGridCell) в системе.Windows.Элементы управления.DataGrid.AddNewCellPrivate(строка DataGridRow, столбец DataGridColumn) в системе.Windows.Элементы управления.DataGrid.CompleteCellsCollection(DataGridRow DataGridRow) в системе.Windows.Элементы управления.DataGrid.GenerateRow(Int32 RowIndex, Int32 слот, объект DataContext) в системе.Windows.Элементы управления.DataGrid.AddSlots(Int32 totalSlots) в системе.Windows.Элементы управления.DataGrid.RefreshRows(Boolean recycleRows, Boolean clearRows) в системе.Windows.Элементы управления.DataGrid.RefreshRowsAndColumns(логические строки очистки) в системе.Windows.Элементы управления.DataGrid.InitializeElements(Boolean recycleRows) в системе.Windows.Элементы управления.DataGridDataConnection.Уведомлениеdatasource_collectionchanged(отправитель объекта, NotifyCollectionChangedEventArgs e) в системе.Windows.Элементы управления.DomainDataSourceView.OnCollectionChanged(NotifyCollectionChangedEventArgs e) в системе.Windows.Элементы управления.DomainDataSourceView.OnCollectionViewCollectionChanged(отправитель объекта, NotifyCollectionChangedEventArgs e) в системе.Windows.Элементы управления.EntityCollectionView.OnCollectionChanged(аргументы NotifyCollectionChangedEventArgs) в системе.Windows.Элементы управления.PagedEntityCollectionView.OnCollectionChanged(аргументы NotifyCollectionChangedEventArgs) в системе.Windows.Элементы управления.PagedEntityCollectionView.RefreshView() в системе.Windows.Элементы управления.PagedEntityCollectionView.SourceCollectionChanged(аргументы NotifyCollectionChangedEventArgs) в системе.Windows.Элементы управления.EntityCollectionView.Обработкаsourcecollectionchanged(отправитель объекта, NotifyCollectionChangedEventArgs e) в системе.Windows.Элементы управления.PagedEntityCollection.RaiseCollectionChanged(действие NotifyCollectionChangedAction, объект Entity, индекс Int32) в системе.Windows.Элементы управления.PagedEntityCollection.CompleteLoad() в системе.Windows.Элементы управления.DomainDataSource.ProcessLoadedEntities(LoadContext loadContext, IEnumerable`1 сущности) в системе.Windows.Элементы управления.DomainDataSource.DomainContext_Loaded(LoadedDataEventArgs e, LoadContext loadContext)
Как я могу избежать этого исключения и сохранить мою сетку данных с привязкой большинства столбцов и одним несвязанным столбцом?
Заранее спасибо.
Редактировать:
Мой 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. Можете ли вы показать свой ассоциированный Xaml?
2. Я добавил код XAML для моей DataGrid в свой вопрос.
Ответ №1:
Рассматривали ли вы возможность использования 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";
}
Я не уверен, каковы ваши точные требования.
Комментарии:
1. Я попробовал это, и действительно, это работает без привязки. Однако я не нашел способа программно вставить некоторое значение для ячеек в этом столбце. Должен ли я изменять источник данных, чтобы получить доступ к значениям?
2. Можете ли вы показать нам XAML для вашего столбца DataGridTemplateColumn?
3. Спасибо, похоже, это может быть решением. Тем не менее, я получаю значение для каждой ячейки в несвязанном столбце из веб-службы WCF (см. Мое редактирование # 2 выше). Знаете ли вы решение этой проблемы?
4. Мне кажется, вам нужно перепроектировать свои базовые объекты данных, к которым вы привязываете сетку. Вы можете создать пользовательский класс POCO, который содержит все требуемые значения, а затем связать их коллекцию с grids ItemsSource, т. е. Все столбцы должны быть привязаны. В общем, сначала разберитесь со своим источником данных, а не пытайтесь перепроектировать сетку.
5. Вероятно, вы правы, я должен перепроектировать объекты данных. Однако на данный момент я выбрал ваше вышеупомянутое решение с DataGridTemplateColumn и загруженным событием для каждого текстового блока, в котором я вызываю веб-службу, чтобы получить недостающее значение. В моем случае это нормально, потому что строк очень мало (максимум 10). Еще раз спасибо.