XAML-Datagrid跳转到行

时间:2017-05-05 09:58:53

标签: c# list xaml datagrid

我是编程c#和XAML的新手,所以我尽力将问题描述得尽可能好。

问题:

  • 我必须列出EEPROM中使用的地址和值。
  • 在EEPROM中并未使用所有地址,因此例如在列表中显示地址范围0 ... 0x0F,0x20 ... 0x2F和0x71 ... 0x72。
  • 用户可以删除或添加EEPROM的新项目(意味着删除或添加列表中的新条目)
  • 插入新项目后,它会自动获取第一个可用地址。 (例如,如果使用0x0到0x0F,则新项目获取地址0x1F)
  • 列表必须按地址顺序显示。

现在问题已完成98%。当列表以正确的顺序显示时,我可以在列表中添加和删除项目。 (感谢所有在其他主题上写过答案的人。我经常遇到类似的问题)

问题:

要显示列表,我在XAML中使用Datagrid和Binding。 列表可能很长,以便查看我必须向下滚动的最后元素。 当我向下滚动并插入一个新项目时,该元素将插入列表的第一个元素之一,因此我必须向上滚动并找出它的插入位置(例如编辑它)。

我的问题: 可以自动跳转到新插入的行吗?

我从昨天开始搜索了很多东西,并尝试了一些我发现的东西,但我找不到解决办法。

我的XAML文件的片段:

<UserControl x:Class="UI.RightsConfigView"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
  xmlns:cal="http://www.caliburnproject.org"
  mc:Ignorable="d" 
  d:DesignHeight="500" d:DesignWidth="800"
  xmlns:conv="clr-namespace:conv">
 ... Background setting ...
<Grid x:Name="myGrid">
<DataGrid x:Name="ParamGrid" Grid.Row="0" ItemsSource="{Binding Values}" SelectedValue="{Binding SelectedValue}"  cal:Message.Attach="[Event MouseDoubleClick] = [Action MouseDoubleClicked]"                              AutoGenerateColumns="False" SelectionMode="Single" >
<DataGrid.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="New Value" cal:Message.Attach="CreateNewValue">                            
                    </MenuItem>
                    <MenuItem Header="Delete Value" cal:Message.Attach="DeleteValue">
                    </MenuItem>
                </ContextMenu>
            </DataGrid.ContextMenu>
 ... Tamplate ...
</DataGrid>
</Grid>
</UserControl>

类RightsConfigViewModel的片段如下所示:

public class RightsConfigViewModel : BaseTabModel, ICloseDetail
{
    public ObservableCollection<ParameterValueModel> Values { get; set; } 
    private void GenerateDisplayList()
    {
          foreach (EEPROMParameter theItem in parameters)
                {
                    ... some cast etc. ...
                    ParameterValueModel theParameterModel = new ParameterValueModel(theItem, this, this);
                    Values.Add(theParameterModel);
                }
           ...
           this.NotifyOfPropertyChange(() => this.Values);
    }

    public void CreateNewValue()
    {
           // Insert at the right position    
           foreach (ParameterValueModel model in Values)
                {
                   if (tempAddress != model.Parameter.Address)
                   {
                        foundFreeAddress = true;
                        modelToAddBefore = Values.IndexOf(model);
                        break;
                    }
                 }
                 ....
                 Values.Add(newModel);
                 Values.Move(Values.IndexOf(newModel), modelToAddBefore);
                 this.NotifyOfPropertyChange(() => this.Values);

    }
}

在代码隐藏中我想在方法中插入方法CreateNewValue()somithing like:

  1. 使用数据网格(C#-class从XAML获取信息)。
  2. 移动或滚动到项目(C#-class controlls GUI)。
  3. 提前感谢您的帮助。

    祝福。

    Elvys

2 个答案:

答案 0 :(得分:0)

您可以调用ScrollIntoView的{​​{1}}方法,并将新添加的项目作为参数传递。在您的情况下,您要在ViewModel中向集合中添加新值,因此您需要通知UI该项目已添加到DataGrid并将其滚动到视图中。

答案 1 :(得分:0)

我终于找到了解决问题的好方法:

基本上我使用了http://www.codeproject.com/Tips/125583/ScrollIntoView-for-a-DataGrid-when-using-MVVM中提出的解决方案,但进行了一些更改以使其有效(对我而言)。

复制c#-class就像它一样,我改变了

  • 命名空间(只是为了适应我的项目)和
  • 在grid.Dispatcher.BeginInvoke我输入匿名函数的行中,所以行如下所示:
    grid.Dispatcher.BeginInvoke( (Action)delegate 
    ...

在我的viewModel的方法中,新的list元素被创建为new 创建的元素由SelectedValue

引用
SelectedValue = newModel;
this.NotifyOfPropertyChange(() => this.SelectedValue);

这就是所有人!