我已成功将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
}
答案 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");
}
}
试试这个。它应该工作......