まず、DataGrid の SelectedItem を ObservableCollection の項目にバインドします。次に、TextBox コントロールを DataGrid (私の場合は SelectedCustomer) から同じ SelectedItem にバインドします。次に、INotifyPropertyChanged を実装して SelectedCustomer を更新し、ObservableCollection を SelectedCustomer と非同期に保ちます。最後に、必要に応じて、TextBox コントロールに UpdateSourceTrigger=PropertyChanged を含めて、TextBox への入力中に DataGrid を更新できます。
開始するために、以下のコード (ViewModelBase を除く) を含めました。
DataGrid と 2 つの 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");
}
}
}
サンプル コードでは、ビューの 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)
});
}
}