【发布时间】:2017-02-01 18:23:29
【问题描述】:
我的 Datagrid 的 Itemsource 更新导致 selectedItem 设置为 null 的问题已经有一段时间了。我一直在疯狂地搜索,终于找到了所需行保持选中状态的东西,但是我在行的第一个单元格周围出现了一个黑框,而不是突出显示了整行。单击向上/向下箭头键将更改所选行,并且新行将按预期突出显示。
这是我的 XAML:
<DataGrid ItemsSource="{Binding Path=FilteredSimResults}" ColumnWidth="*" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3" IsReadOnly="True"
SelectedItem="{Binding Path=SelectedPdf}" SelectionMode="Single" SelectionUnit="FullRow" AlternatingRowBackground="LightGray"
Visibility="{Binding Path=IsNotPopulating}" Margin="5,0" Name="PdfList"
AutoGeneratingColumn="OnAutoGeneratingColumn">
<DataGrid.Resources>
<Style TargetType="{x:Type DataGridRow}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsBold}" Value="True">
<Setter Property="FontWeight" Value="Bold" />
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.Resources>
<DataGrid.ItemContainerStyle>
<Style TargetType="DataGridRow">
<EventSetter Event="Selected" Handler="OnRowSelected"/>
</Style>
</DataGrid.ItemContainerStyle>
</DataGrid>
这是我的代码:
public SimulationGrid()
{
InitializeComponent();
CollectionView myCollectionView = (CollectionView)CollectionViewSource.GetDefaultView(PdfList.Items);
((INotifyCollectionChanged)myCollectionView).CollectionChanged += OnItemSourceChanged;
}
private void OnItemSourceChanged(object sender, EventArgs e)
{
if (_index == null) return;
object item = _index;
Dispatcher.BeginInvoke(DispatcherPriority.Input, new Action(() =>
{
PdfList.SelectedItem = item;
PdfList.ScrollIntoView(item);
DataGridRow row = (DataGridRow)PdfList.ItemContainerGenerator.ContainerFromItem(item);
row.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
}));
}
private void OnRowSelected(object sender, RoutedEventArgs e)
{
_index = ((DataGridRow)sender).Item;
}
编辑: 我对此有约束力:
public List<SimResult> FilteredSimResults
{
get
{
List<SimResult> filteredResults = new List<SimResult>();
if (!Populating && SimResults != null)
{
foreach (SimResult result in SimResults)
{
if ((string.IsNullOrEmpty(FilterKey) || result.PatientId.ToLower().Contains(FilterKey.ToLower()))
&& (ShowingHiddenSims != result.IsVisible))
{
filteredResults.Add(result);
}
}
}
return SimSortDirection == ListSortDirection.Descending
? filteredResults.OrderByDescending(o => o.GetType().GetProperty(SimSortColumn).GetValue(o)).ToList()
: filteredResults.OrderBy(o => o.GetType().GetProperty(SimSortColumn).GetValue(o)).ToList();
}
}
完整的列表保存在内存中(SimResults),但它有几个可以修改列表的东西,所以只有修改后的列表被发送到绑定。所以,每次修改,都会修改完整的列表。
【问题讨论】:
-
很难说没有看到 DataGrid 绑定到什么。您没有对 FilteredSimResults 的代码隐藏引用,它是 DataGrid 的 ItemsSource。那是 ObservableCollection
吗?还有数据是如何被编辑的?您是否替换了网格中的所有值。你要替换被选中的那个吗?您是否将对象留在列表中并仅编辑属性等? -
我添加了有关我要绑定的内容的详细信息。