2013-04-03 4 views
0

Я успешно связал DataTable с управлением DataGrid в WPF with MVVM. (Я определил DataTable в viewmodel.)Как выбрать строку DataGrid в WPF с MVVM, когда DataGrid привязан к DataTable

Тогда я определил свойство типа и привязан к свойству SelectedItem элемента управления DataGrid.

Я могу получить выбранный элемент через это. Но я попытался установить выбранный элемент, но я не смог найти способ сделать это. Может ли кто-нибудь помочь мне разобраться в этом.

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

Лучшее решение Вы не можете использовать DataTable ToBind с DataGrid, сделать Dto и привязать к DataGrid со списком Dto и привязать свойство Dto Type с SelectedItem –

+1

add Mode = TwoWay и использовать SelectedItem вместо SelectedValue – blindmeis

+0

Я использовал оба метода SelectedValue и SelectedItem. Но ничего не получилось. – Haritha

ответ

3

Если я правильно понимаю, вы хотите, чтобы выбрать строку сетки из класса программно MainViewModel. Если это необходимо, попробуйте выполнить код ниже. SelectRow - это метод в MainViewModel. Это может быть не полное решение, а какая-то идея для вас.

public void SelectRow(int rowIndex) 
{ 
    SelectedRow = SizeQuantityTable.DefaultView[rowIndex]; 
} 
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"); 
      } 
     } 

Попробуйте это. Это должно сработать ...