[C#][WPF]修改数据网格的选定项后,它不再更新



我最近刚接触C#和WPF。我遇到了一个难题。

在数据网格中编辑所选项目后,所选项目将不再更新。我使用自定义类并将其成员变量绑定到数据网格。

(1( MyCustomCalss

public class DualString : IComparable
{
public string Value { get; private set; }
public string Origin { get; private set; }
public string Text { get { return string.Format("{0}({1})", Value, Origin); } }
public DualString()
{
Value = null;
Origin = null;
}
public void Set(string value, string origin)
{
Value = value?.Trim();
Origin = origin?.Trim();
}
}

(2( xaml中的DataGrid定义。

<DataGrid x:Name="dataGrid_tag" IsReadOnly="True" SelectionMode="Extended" SelectionChanged="dataGrid_tag_SelectionChanged" >
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Text}" Header="Tag" Width="176"/>
</DataGrid.Columns>
<DataGrid.ContextMenu>
<ContextMenu>
<MenuItem x:Name="datagrid_tag_menu_modify" Header="Modify Tag" Click="datagrid_tag_menu_modify_Click"  />                        
</ContextMenu>
</DataGrid.ContextMenu>
</DataGrid>

(3( ItemSources是由代码设置的,如下所示。请注意,OhterList在另一个DataGrid中使用。

private ObservableCollection<DualString> _TagList = new ObservableCollection<DualString>();
private ICollectionView _DataGridViewTag;
foreach (DualString tag in OtherList)
_TagList.Add(tag);
_DataGridViewTag = CollectionViewSource.GetDefaultView(_TagList);
dataGrid_tag.ItemsSource = _DataGridViewTag;

(4( 代码非常简单,如下所示。

private void datagrid_tag_menu_modify_Click(object sender, RoutedEventArgs e)
{
DualString selectedTag = dataGrid_tag.SelectedItem as DualString;
selectedTag.Set("testValue", "testOrigin");
_DataGridViewTag?.Refresh();
}

第一次执行datagrid_tag_menu_modify_Click时,datagrid_tag.SelectedItem返回完全正确的实例。然而,一旦我修改了它,dataGrid_tag.SelectedItem就不再更改了。

我不知道为什么会出现这种症状。

我自己找到了一个解决方案。它是由多选引起的。修改项源的项后,DataGrid似乎永远保留其SelectedItems列表中的第一个选择项。我在修改项之前执行UnselectAll((,然后问题就消失了。

private void datagrid_tag_menu_modify_Click(object sender, RoutedEventArgs e)
{
DualString selectedTag = dataGrid_tag.SelectedItem as DualString;

// execute UnselectAll() before modifying item.
dataGrid_tag.UnselectAll();

selectedTag.Set("testValue", "testOrigin");
// re-select item.
dataGrid_tag.SelectedItem = selectedTag;
_DataGridViewTag?.Refresh();
}

最新更新