当DataGrid绑定到DataTable时,如何使用MVVM在WPF中选择DataGrid行

时间:2013-04-03 08:54:26

标签: wpf mvvm datagrid datatable

我已成功将DataTable绑定到DataGrid中的WPF with MVVM控件。 (我在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
}

2 个答案:

答案 0 :(得分:3)

如果我理解正确,您希望从MainViewModel类以编程方式选择网格行。如果需要,请尝试下面的代码。 SelectRow是中的方法 MainViewModel。这可能不是完整的解决方案,但对您的要求有一些想法。

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

答案 1 :(得分:0)

长期悬而未决的问题??我在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");
            }
        }

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