【问题标题】:How to select a DataGrid row in WPF with MVVM when the DataGrid is bound to a DataTable当 DataGrid 绑定到 DataTable 时,如何使用 MVVM 在 WPF 中选择 DataGrid 行
【发布时间】:2013-04-03 08:54:26
【问题描述】:

我已成功将DataTable 绑定到WPF with MVVM 中的DataGrid 控件。 (我在viewmodel中定义了DataTable。)

然后我定义了一个DataRowView类型的属性并绑定到DataGrid控件的SelectedItem属性。

我可以通过它获得选定的项目。但我试图设置选定的项目,但我找不到办法。谁能帮我弄清楚。

view

<Window x:Class="Pivot.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:vm="clr-namespace:Pivot.ViewModels"
    Title="MainWindow" Height="350" Width="525">
<Grid>

    <Grid.DataContext>
        <vm:MainViewModel />
    </Grid.DataContext>

    <DataGrid 
        ItemsSource="{Binding SizeQuantityTable}"
        AutoGenerateColumns="True"
        SelectedValue="{Binding SelectedRow}" 
        Margin="0,0,0,120" />
</Grid>
</Window>

View Model

public class MainViewModel : ViewModelBase
{
    #region Declarations

    private DataTable sizeQuantityTable;
    private DataRowView selectedRow;

    #endregion

    #region Properties

    /// <summary>
    /// Gets or sets the size quantity table.
    /// </summary>
    /// <value>The size quantity table.</value>
    public DataTable SizeQuantityTable
    {
        get
        {
            return sizeQuantityTable;
        }
        set
        {
            sizeQuantityTable = value;
            NotifyPropertyChanged("SizeQuantityTable");
        }
    }

    /// <summary>
    /// Gets or sets the selected row.
    /// </summary>
    /// <value>The selected row.</value>
    public DataRowView SelectedRow
    {
        get
        {
            return selectedRow;
        }
        set
        {
            selectedRow = value;
            NotifyPropertyChanged("SelectedRow");
        }
    }

    #endregion

    #region Constructors

    /// <summary>
    /// Initializes a new instance of the <see cref="MainViewModel"/> class.
    /// </summary>
    public MainViewModel()
    {
        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);

        DataRow row4 = this.SizeQuantityTable.NewRow();
        row4[sizeQuantityColumn] = "Yellow";
        row4[sColumn] = "30";
        row4[mColumn] = "33";
        this.SizeQuantityTable.Rows.Add(row4);

    }

    #endregion
}

【问题讨论】:

  • 不能使用DataTable绑定DataGrid的最佳解决方案,制作Dto并使用Dto列表绑定DataGrid,并绑定Dto类型属性与SelectedItem
  • 添加 Mode=TwoWay 并使用 SelectedItem 而不是 SelectedValue
  • 我同时使用了 SelectedValue 和 SelectedItem。但没有任何效果。
  • @Jignesh Raj:我的主要目标是programmatically 将列添加到数据网格。我可以从数据库only 中实现它。所以我只想要数据表中的解决方案。
  • 你在你的问题中说我正在使用 MVVM 所以最好的解决方案是创建 Dto 而不是 DataTable 并绑定 SelectedItem 属性而不是 Selected Value 属性

标签: wpf mvvm datagrid datatable


【解决方案1】:

如果我理解正确,您想以编程方式从 MainViewModel 类中选择网格行。如果这是需要,请尝试以下代码。 SelectRow 是中的方法 主视图模型。这可能不是完整的解决方案,但可以满足您的需求。

public void SelectRow(int rowIndex)
{
     SelectedRow = SizeQuantityTable.DefaultView[rowIndex];
}

【讨论】:

    【解决方案2】:

    长期悬而未决的问题??我在 XAML 中进行了此修改,通过单击按钮,我可以根据文本框行值更改网格选择。

    <Grid>
    
            <Grid.DataContext>
                <vm:MainViewModel x:Name="Model"/>
            </Grid.DataContext>
    
            <DataGrid  
            ItemsSource="{Binding SizeQuantityTable}"
            AutoGenerateColumns="True"
            SelectedIndex="{Binding SelectedRow, Mode=TwoWay}" 
            Margin="0,0,0,120" />
            <Button Content="Button" Height="53" HorizontalAlignment="Left" Margin="121,214,0,0" Name="button1" VerticalAlignment="Top" Width="118" Click="button1_Click" />
            <TextBox Height="21" HorizontalAlignment="Left" Margin="272,218,0,0" Name="textBox1" VerticalAlignment="Top" Width="114" Text="1" />
        </Grid>
    
     /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    //I know this is not the correct way to do it in MVVM but I am am taking time from my work... so need to be quick.. :)
            private void button1_Click(object sender, RoutedEventArgs e)
            {
                Model.SelectedRow = int.Parse(textBox1.Text);
            }
        }
    
    
    
      private int selectedRow;
    
    /// <summary>
            /// Gets or sets the selected row.
            /// </summary>
            /// <value>The selected row.</value>
            public int SelectedRow
            {
                get
                {
                    return selectedRow;
                }
                set
                {
                    selectedRow = value;
                    OnPropertyChanged("SelectedRow");
                }
            }
    

    试试这个。它应该工作......

    【讨论】:

      猜你喜欢
      • 2018-02-07
      • 2013-03-24
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 2012-03-06
      • 2019-12-22
      • 1970-01-01
      • 2013-07-28
      相关资源
      最近更新 更多