首先,将 DataGrid 中的 SelectedItem 绑定到 ObservableCollection 中的项目。然后将 TextBox 控件绑定到 DataGrid 中的相同 SelectedItem(在我的情况下为 SelectedCustomer)。然后通过实现 INotifyPropertyChanged 来更新 SelectedCustomer,以使 ObservableCollection 与 SelectedCustomer 保持同步。最后,如果需要,您可以在 TextBox 控件中包含 UpdateSourceTrigger=PropertyChanged 以在输入 TextBox 时更新 DataGrid。
我已包含以下代码(ViewModelBase 除外)以帮助您入门。
这是带有一个 DataGrid 和两个 TextBox 控件的 XAML:
<Window x:Class="DataGridTextBox.Views.MainView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:WpfToolkit="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit"
Title="Main Window" Height="400" Width="800">
<DockPanel>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<WpfToolkit:DataGrid
Grid.Column="0"
SelectedItem="{Binding Path=SelectedCustomer, Mode=TwoWay}"
ItemsSource="{Binding Path=Customers, Mode=OneWay}" >
</WpfToolkit:DataGrid>
<StackPanel Grid.Column="1">
<TextBlock Text="First Name"/>
<TextBox Text="{Binding Path=SelectedCustomer.FirstName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
<TextBlock Text="Last Name"/>
<TextBox Text="{Binding Path=SelectedCustomer.LastName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</StackPanel>
</Grid>
</DockPanel>
</Window>
这是一个简单的 ViewModel:
public class MainViewModel : ViewModelBase
{
public MainViewModel()
{
_customers = Customer.GetSampleCustomerList();
_selectedCustomer = _customers[0];
}
private ObservableCollection<Customer> _customers = null;
public ObservableCollection<Customer> Customers
{
get
{
return _customers;
}
}
private Customer _selectedCustomer;
public Customer SelectedCustomer
{
get
{
return _selectedCustomer;
}
set
{
_selectedCustomer = value;
OnPropertyChanged("SelectedCustomer");
}
}
}
对于示例代码,我只是在此处将 View 的 DataContext 设置为 ViewModel:
public partial class App : Application
{
private void OnStartup(object sender, StartupEventArgs e)
{
// Create the ViewModel and expose it using the View's DataContext
Views.MainView view = new Views.MainView();
view.DataContext = new ViewModels.MainViewModel();
view.Show();
}
}
最后是一个简单的客户定义:
public class Customer
{
public String FirstName { get; set; }
public String MiddleName { get; set; }
public String LastName { get; set; }
public String Address { get; set; }
public Boolean IsNew { get; set; }
// A null value for IsSubscribed can indicate
// "no preference" or "no response".
public Boolean? IsSubscribed { get; set; }
public Customer(String firstName, String lastName,
String address, Boolean isNew, Boolean? isSubscribed)
{
this.FirstName = firstName;
this.MiddleName = lastName;
this.LastName = lastName;
this.Address = address;
this.IsNew = isNew;
this.IsSubscribed = isSubscribed;
}
public static ObservableCollection<Customer> GetSampleCustomerList()
{
return new ObservableCollection<Customer>(new Customer[4] {
new Customer("Jeff", "Zero",
"12 North Third Street, Apartment 45",
false, true),
new Customer("Joel", "One",
"34 West Fifth Street, Apartment 67",
false, false),
new Customer("Jon", "Two",
"56 East Seventh Street, Apartment 89",
true, null),
new Customer("Zamboni", "Three",
"78 South Ninth Street, Apartment 10",
true, true)
});
}
}