[英][C#][WPF] After modifying the selected item of datagrid, it is no longer updated
I'm new to C# and WPF recently.我最近是 C# 和 WPF 的新手。 I fell into a difficult problem for me.我陷入了一个难题。
After editing the selected item in the datagrid, the selected item is no longer updated at all.在数据网格中编辑所选项目后,所选项目根本不再更新。 I use custom class and binding it's member variable to datagrid.我使用自定义 class 并将其成员变量绑定到数据网格。
(1) MyCustomCalss (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) DataGrid definition in xaml. (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 was set by code, like below. (3) ItemSources 由代码设置,如下所示。 Note that OhterList is used in another DataGrid.注意 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) code is very simple, like below. (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();
}
The first time I execute datagrid_tag_menu_modify_Click, dataGrid_tag.SelectedItem returns exactly correct instance.我第一次执行 datagrid_tag_menu_modify_Click 时,dataGrid_tag.SelectedItem 返回完全正确的实例。 However, once I have modified the it, the dataGrid_tag.SelectedItem no longer changes at all.但是,一旦我修改了它, dataGrid_tag.SelectedItem 就不再改变了。
I've no idea why this symptom is happened.我不知道为什么会出现这种症状。
I found a solution myself.我自己找到了解决方案。 It is caused by multi-selection.它是由多选引起的。 After modifying item of item source, it seems that DataGrid holds the first selection item forever in it's SelectedItems list.修改项目源的项目后,DataGrid 似乎将第一个选择项永久保存在其 SelectedItems 列表中。 I execute UnselectAll() before modifying item, then the problem went away.我在修改项目之前执行 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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.