如何使用MVVM应用程序在WPF中以编程方式设置DataGrid的选定项目? [英] How to set selected item of a DataGrid programmatically in WPF with MVVM application?
问题描述
我将 DataTable
绑定到 DataGrid
控件。如何以编程方式设置所选项目?
I have bound the DataTable
to the DataGrid
control. How can I set the selected item programmatically ?
示例
Example
在我的视图模型中
我有一个DataTable类型的属性绑定DataGrid
In my view model
I have a property of type DataTable to bind the DataGrid
private DataTable sizeQuantityTable;
public DataTable SizeQuantityTable
{
get
{
return sizeQuantityTable;
}
set
{
sizeQuantityTable = value;
NotifyPropertyChanged("SizeQuantityTable");
}
}
我的 XAML
<DataGrid
ItemsSource="{Binding SizeQuantityTable}"
AutoGenerateColumns="True"
Margin="0,0,0,120" />
视图模型的构造函数
虚拟值)
this.SizeQuantityTable = new DataTable();
DataColumn sizeQuantityColumn = new DataColumn();
sizeQuantityColumn.ColumnName = "Size Quantity";
this.SizeQuantityTable.Columns.Add(sizeQuantityColumn);
DataColumn sColumn = new DataColumn();
sColumn.ColumnName = "S";
this.SizeQuantityTable.Columns.Add(sColumn);
DataColumn mColumn = new DataColumn();
mColumn.ColumnName = "M";
this.SizeQuantityTable.Columns.Add(mColumn);
DataRow row1 = this.SizeQuantityTable.NewRow();
row1[sizeQuantityColumn] = "Blue";
row1[sColumn] = "12";
row1[mColumn] = "15";
this.SizeQuantityTable.Rows.Add(row1);
DataRow row2 = this.SizeQuantityTable.NewRow();
row2[sizeQuantityColumn] = "Red";
row2[sColumn] = "18";
row2[mColumn] = "21";
this.SizeQuantityTable.Rows.Add(row2);
DataRow row3 = this.SizeQuantityTable.NewRow();
row3[sizeQuantityColumn] = "Green";
row3[sColumn] = "24";
row3[mColumn] = "27";
this.SizeQuantityTable.Rows.Add(row3);
确定。我创建了三列,即 sizeQuantityColumn
, sColumn
和 mColumn
并添加了三行,即 row1
, row2
和 row2
。
OK. I have created three columns namely sizeQuantityColumn
, sColumn
and mColumn
and added three rows namely row1
, row2
and row2
.
所以,假设我想将选定的项目设置为 row2
(所以在视图中,第二行应该被突出显示)。
So, Let's say I wanna set the selected item as row2
(So in the view, the second row should be highlighted).
我该怎么做?
编辑
我将DataGrid的 SelectedIndex
硬编码为1.(所以应该选择第二行)。在设计时间
中,它显示为已选择。但不是在运行时间。您可以在下面的快照中看到它。
I hardcoded the SelectedIndex
of the DataGrid to 1. (So the second row should be selected). In design time
it shows as selected. But not in the run time. You can see it in the below snapshot.
所以最重要的问题是不突出显示行。
So ultimaltely the problem is Not highlighting the row.
推荐答案
p>有几种方法可以在 DataGrid
中选择项目。这只是取决于哪一种效果最好的情况
There are a few way to select items in the DataGrid
. It just depends which one works best for the situation
首先最基本的是 SelectedIndex
这将只是选择行在 DataGrid中的索引中
First and most basic is SelectedIndex
this will just select the Row at that index in the DataGrid
<DataGrid SelectedIndex="{Binding SelectedIndex}" />
private int _selectedIndex;
public int SelectedIndex
{
get { return _selectedIndex; }
set { _selectedIndex = value; NotifyPropertyChanged("SelectedIndex"); }
}
SelectedIndex = 2;
SelectedItem
将选择与你设置的行
<DataGrid SelectedItem="{Binding SelectedRow}" />
private DataRow _selectedRow;
public DataRow SelectedRow
{
get { return _selectedRow; }
set { _selectedRow = value; NotifyPropertyChanged("SelectedRow");}
}
SelectedRow = items.First(x => x.whatever == something);
最常见的是 SelectedValue
code> SelectedValuePath 设置,在这种情况下,您设置要选择的列,然后可以通过设置相应的值
The most common one is SelectedValue
with SelectedValuePath
set, in this case you set the column you want to select with and then to can select the row by setting the corresponding value
<DataGrid SelectedValuePath="Size Quantity" SelectedValue="{Binding SelectionValue}"
private string _selectedValue
public string SelectionValue
{
get { return _selectedValue; }
set { _selectedValue = value; NotifyPropertyChanged("SelectionValue"); }
}
SelectionValue = "Blue";
编辑:
这是我的测试并且它突出显示只是很好
Here is my test and it is highlighting just fine
代码:
public partial class MainWindow : Window, INotifyPropertyChanged
{
public MainWindow()
{
InitializeComponent();
this.SizeQuantityTable = new DataTable();
DataColumn sizeQuantityColumn = new DataColumn();
sizeQuantityColumn.ColumnName = "Size Quantity";
...................
........
}
private string _selectedValue;
public string SelectionValue
{
get { return _selectedValue; }
set { _selectedValue = value; NotifyPropertyChanged("SelectionValue"); }
}
private int _selectedIndex;
public int SelectedIndex
{
get { return _selectedIndex; }
set { _selectedIndex = value; NotifyPropertyChanged("SelectedIndex"); }
}
private DataTable sizeQuantityTable;
public DataTable SizeQuantityTable
{
get { return sizeQuantityTable; }
set { sizeQuantityTable = value; NotifyPropertyChanged("SizeQuantityTable"); }
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
SelectedIndex = 2;
}
private void Button_Click_2(object sender, RoutedEventArgs e)
{
SelectionValue = "Blue";
}
private void NotifyPropertyChanged(string p)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(p));
}
}
}
Xaml:
<Window x:Class="WpfApplication21.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="202" Width="232" Name="UI">
<Grid DataContext="{Binding ElementName=UI}">
<DataGrid SelectedValuePath="Size Quantity"
SelectedValue="{Binding SelectionValue}"
SelectedIndex="{Binding SelectedIndex}"
ItemsSource="{Binding SizeQuantityTable}"
AutoGenerateColumns="True"
Margin="0,0,0,41" />
<StackPanel Orientation="Horizontal" Height="37" VerticalAlignment="Bottom" >
<Button Content="SelectedIndex" Height="26" Width="107" Click="Button_Click_1"/>
<Button Content="SelectedValue" Height="26" Width="107" Click="Button_Click_2"/>
</StackPanel>
</Grid>
</Window>
结果:
这篇关于如何使用MVVM应用程序在WPF中以编程方式设置DataGrid的选定项目?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!