wpf - 如何使用 MVVM 应用程序在 WPF 中以编程方式设置 DataGrid 的选定项?

标签 wpf mvvm datagrid datatable

我绑定(bind)了DataTableDataGrid控制。如何设置选中项以编程方式 ?

Example



在我的 view model我有一个 DataTable 类型的属性来绑定(bind) 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" />
constructor View 模型的(分配虚拟值)

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 , sColumnmColumn并添加了三行,即 row1 , row2row2 .

所以,假设我想将所选项目设置为 row2 (所以在 View 中,应该突出显示第二行)。

我怎样才能做到这一点?

编辑

我硬编码了 SelectedIndex的 DataGrid 为 1。(因此应选择第二行)。在 design time它显示为选中。但不是在运行时。您可以在下面的快照中看到它。

所以最终问题是未突出显示 行。

enter image description here

最佳答案

有几种方法可以选择 DataGrid 中的项目。 .这取决于哪一个最适合这种情况

第一个也是最基本的是SelectedIndex这将只选择 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);

最常见的是SelectedValueSelectedValuePath设置,在这种情况下,您设置要选择的列,然后可以通过设置相应的值来选择行
<DataGrid SelectedValuePath="Size Quantity" SelectedValue="{Binding SelectionValue}" 

private string _selectedValue
public string SelectionValue 
{
    get { return _selectedValue; }
    set { _selectedValue = value; NotifyPropertyChanged("SelectionValue"); }
}

SelectionValue = "Blue";

编辑:

这是我的测试,它突出显示就好了

代码:
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));
        }
    }
}

xml:
<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>

结果:

enter image description here

关于wpf - 如何使用 MVVM 应用程序在 WPF 中以编程方式设置 DataGrid 的选定项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15826142/

相关文章:

c# - 我应该如何在 WPF 窗口中动态创建用户控件?

wpf - 使用相同的 DataContext 设置 DataGrid 和 ContextMenu

c# - 将按钮绑定(bind)到不同的 ViewModel [MVVM]

c# - 如何为用作 DataGrid 的 ItemsSource 的项目的集合属性中的每个项目生成并绑定(bind)一列

css - 如何覆盖 DataGrid header 的 GWT 混淆样式

c# - 如何检查 WPF 应用程序是否已经在运行?

wpf - 为什么文本框边框红色出现在文本框上方的面板上

.net - Dragablz 组件并使用不同的窗口作为宿主

.net - 仅重新设计 wpf 控件的一部分。是否可以?

datagrid - 清晰度网格行扩展器 : Grid placeholder is visible even if there is row data is wrapped in form for inline edit