我最近刚接触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();
}