以编程方式将Datagrid行放入WPF,MVVM中的视图中

时间:2012-04-12 20:13:13

标签: wpf mvvm datagrid

我想以编程方式将一行数据网格放入视图中。我有超过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");
        }
    }

它对我不起作用。

2 个答案:

答案 0 :(得分:6)

对于常规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 );
    }
}

答案 1 :(得分:2)

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

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

<DataGrid 
    ItemsSource="{Binding UnderyingItemsCollection}" 
    SelectedItem="{Binding RecentlyAddedItem, Mode=TwoWay}"
    IsSynchronizedWithCurrentItem="True">