C# 以编程方式设置DataGrid.SelectedItem

C# 以编程方式设置DataGrid.SelectedItem,c#,wpf,datagrid,C#,Wpf,Datagrid,我有多个数据网格,存储一个唯一的ID,然后是关于此人、公司等的多列信息。数据网格存储在选项卡控件中,单独的选项卡项用于填写有关此人/公司的详细信息。当用户单击“添加”时,我希望将它们带回第一个选项卡Item,并自动选择用户添加的新项目(个人或公司)。数据网格绑定到可观察集合 我已经可以使用设置选项卡项了 tabItem.IsSelected = true 是否有一种方法可以让我在单击“添加”后设置选项卡项,循环查看数据网格中的项,找到新项的ID并将SelectedItem设置为该项?当我将项目

我有多个
数据网格
,存储一个唯一的ID,然后是关于此人、公司等的多列信息。
数据网格
存储在
选项卡控件
中,单独的
选项卡项
用于填写有关此人/公司的详细信息。当用户单击“添加”时,我希望将它们带回第一个
选项卡Item
,并自动选择用户添加的新项目(个人或公司)。
数据网格
绑定到
可观察集合

我已经可以使用设置选项卡项了

tabItem.IsSelected = true
是否有一种方法可以让我在单击“添加”后设置
选项卡项
,循环查看
数据网格中的项
,找到新项的ID并将
SelectedItem
设置为该项?当我将项目分配给个人/公司时,我会知道该项目的ID

编辑:我试过使用

CompanyView.MoveCurrentTo(companyDetails);

公司视图是
集合视图
公司详细信息
用户添加的公司的详细信息,但是这不起作用。

您说过可以将
选项卡项
设置回原位,所以让我们继续

数据网格的项目之间循环:

int ID=5; //you said you know the ID field

var items = yourDataGrid.Items as ObservableCollection<CompanyModel>;
foreach (CompanyModel m in items)
{
     if (m.Id == ID)
     { 
        yourDataGrid.SelectedItem = item;                                   
        yourDataGrid.ScrollIntoView(yourDataGrid.SelectedItem);
        break;
     }
 }
intid=5//你说你知道ID字段
var items=yourDataGrid.items作为ObservableCollection;
foreach(项目中的公司模型m)
{
如果(m.Id==Id)
{ 
yourDataGrid.SelectedItem=item;
yourDataGrid.ScrollIntoView(yourDataGrid.SelectedItem);
打破
}
}

MVVM模型非常适合这种情况

如果绑定到集合,则可以在将更改推送到setter中的集合之前捕获该更改,并使用List.Except()

由于要将DataGrid绑定到ObservableCollection,因此可以为SelectedItem添加附加绑定,并在找到更改并将更改推送到集合后手动设置SelectedItem

何时返回所需选项卡项取决于您的选择

由于要绑定SelectedItem,因此需要添加

SelectionMode="Single"
NotifyPropertyChanged();是因为MVVM模型而使用的

特性:

private Item _selectedItem;

public Item SelectedItem
{
    get { return _selectedItem; }
    set
    {
        _selectedItem= value;
        NotifyPropertyChanged();
    }
}

private ObservableCollection<Item> _items;

public ObservableCollection<Item> Items
{
    get { return _items; }
    set
    {
        var tempList = value.Except(_items).ToList();

        _addresses = value;

        //if you are 100% sure only one item will be added at a time, you can add .First()
        //edit: please also keep in mind you need to check if there is actually an item that was added. when items are removed, this would also try to change the SelectedItem
        SelectedItem = tempList.First();

        NotifyPropertyChanged();
    }
}
private Item\u selectedItem;
公共项目选择项
{
获取{return\u selectedItem;}
设置
{
_选择editem=值;
NotifyPropertyChanged();
}
}
私人可观测收集项目;
公共可观测收集项目
{
获取{return\u items;}
设置
{
var templast=value.Except(_items).ToList();
_地址=值;
//如果100%确定一次只添加一项,则可以添加.First()
//编辑:请记住,您需要检查是否确实添加了项目。删除项目时,这也会尝试更改SelectedItem
SelectedItem=templast.First();
NotifyPropertyChanged();
}
}
wpf绑定示例:

<DataGrid
    ItemsSource="{Binding Items}"
    SelectionMode="Single"
    SelectedItem="{Binding SelectedItem}"
>


感谢您的回答,但我遇到一个错误,
无法将类型为“SdcDatabase.Model.CompanyModel”的对象强制转换为类型为“System.Data.DataRowView”。
CompanyModel
只是我的模型类型。DataGrid的Items
属性应该是它绑定到的对象的
observateCollection
,而不是UI DataRow对象。如果要查找实际的UI对象,可能需要使用
ItemContainerGenerator
。也就是说,如果您正确地强制转换它,您应该能够使用
foreach(companyModels中的var c)
并测试Id属性。。。如果正确,您可以按您的方式将
.SelectedItem
设置为该对象。@Rachel在我看来,OP开发代码隐藏应用程序。或者这并不重要?@Steppup OP提到将.ItemsSource绑定到ObservableCollection,因此
.Items
属性将是该对象。如果您要设置
.ItemsSource=dataTable.DefaultView
,那么您可以像您一样将
.Items
中的每个对象强制转换为
DataRowView
,但我从不向任何WPF开发人员推荐:)@Steppup这不是我见过的最糟糕的情况,它的方向是正确的:)只需将强制转换从
DataRowView
更改为
CompanyModel
(可能必须强制转换
yourDataGrid.Items
以及
observeCollection
),更改检查项目的方式,我不知道您试图用事件处理程序说什么。。。。除非你想写一个更长的解释,说明什么时候以及为什么要使用它,否则我会删除它:)如果你的DataGrid绑定到一个
ObservableCollection
,你应该能够将
DataGrid.Items
投射到你的集合中,搜索它并找到要选择的正确项目。也就是说,根据您的总体设计,最好将DataGrid的
SelectedItem
绑定到对象模型上的某个对象,并设置对象模型值,而不是与UI对象混淆。