简体   繁体   English

[C#][WPF] 修改datagrid的选中项后不再更新

[英][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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM