5

我想以编程方式将一行数据网格带入视图。我有超过 100 行。当我创建一行时(我通过将一个项目添加到一个可观察的集合来执行此操作)我希望选择该新行并将其显示在视图中。我能够在我的代码中选择新行,但无法进行滚动。此外,我希望该行的第一个单元格处于编辑模式,以便用户可以输入文本。我正在遵循应用程序的 MVVM 模式,并希望在我的视图中保持零代码。我怎样才能做到这一点?

任何帮助或建议将不胜感激......

更新:

这就是我在 XAML 中所做的

<telerik:RadGridView ItemsSource="{Binding AllPartClasses}" 
                     SelectedItem="{Binding SelectedPartClassViewModel, Mode=TwoWay}"         
                     SelectionMode="Single" IsSynchronizedWithCurrentItem="True">

在我的视图模型中,我这样做了

void AddNewPartClassExecute()
    {
        PartClass newPartClass = new PartClass();
        PartClassViewModel tempPartClass = new PartClassViewModel(newPartClass);
        tempPartClass.IsInValid = true;
        AllPartClasses.Add(tempPartClass);
        SelectedPartClassViewModel = tempPartClass;
        Global.DbContext.PartClasses.AddObject(newPartClass);

        //OnPropertyChanged("AllPartClasses");
    }
public PartClassViewModel SelectedPartClassViewModel 
    { 
        get
        {  
            return _selectedPartClassViewModel;
        }
        set
        {
            _selectedPartClassViewModel = value;
            OnPropertyChanged("SelectedPartClassViewModel");
        }
    }

它对我不起作用。

4

2 回答 2

9

对于常规 WPF DataGrid,您可以使用ScrollIntoView. 在您的视图中,将 SelectionChanged 事件连接到视图代码隐藏 cs 文件中的以下内容。

private void OnSelectionChanged( object sender, SelectionChangedEventArgs e )
{
    Selector selector = sender as Selector;
    DataGrid dataGrid = selector as DataGrid;
    if ( dataGrid != null && selector.SelectedItem != null && dataGrid.SelectedIndex >= 0 )
    {
        dataGrid.ScrollIntoView( selector.SelectedItem );
    }
}
于 2014-10-29T19:30:23.083 回答
0

遵循 MVVM 模式时,您不应执行特定于 UI 的操作,例如从代码中滚动。

解决方案很简单 - 只需将DataGrid.SelectedItem绑定到 ViewModel 中的属性,当在 items 集合中添加新项目时,只需更新绑定到的属性,SelectedItem以便它引用刚刚添加的项目,并且数据网格应自动选择适当的行。

<DataGrid 
    ItemsSource="{Binding UnderyingItemsCollection}" 
    SelectedItem="{Binding RecentlyAddedItem, Mode=TwoWay}"
    IsSynchronizedWithCurrentItem="True">
于 2012-04-12T20:16:30.790 回答