このMSDNWalktroughの指示に従って、サンプルプロジェクトを作成しました。サンプルを少し変更して、2つの追加のTextBoxコントロールと1つのボタンを作成しました。
それはそれがどのように見えるかです:
コードファーストアプローチとDbContextの派生クラスをコード生成アイテムとして使用して、単純なモデルを作成しました。
その後、作成されたデータソースを使用しました。
「名前」-TextBoxは読み取り専用です。「検索」-ボタンが押されたときに、ユーザーがIDを入力して検索できるようにしたい。したがって、指定されたIDが見つかった場合は、「名前」-TextBoxを更新する必要があります。DataGridは実際のコードでは必要ないため、あまり気にしません。
CollectionViewSource.View.CurrentItemプロパティは読み取り専用であるため、CollectionViewSourceを更新して入力を検証する方法がわかりません。
編集:それは私の(ほぼ完全にデザイナーが生成した)コードです:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" mc:Ignorable="d"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:my="clr-namespace:SchoolModel;assembly=SchoolModel"
Loaded="Window_Loaded">
<Window.Resources>
<CollectionViewSource x:Key="departmentViewSource" d:DesignSource="{d:DesignInstance my:Department, CreateList=True}" />
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid DataContext="{StaticResource departmentViewSource}" Name="grid1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Label Content="Department ID:" Grid.Column="0" Grid.Row="0" HorizontalAlignment="Left" Margin="3" VerticalAlignment="Center" />
<TextBox Grid.Column="1" Grid.Row="0" Height="23" HorizontalAlignment="Left" Margin="3" Name="departmentIDTextBox" Text="{Binding Path=DepartmentID, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}" VerticalAlignment="Center" Width="120" />
</Grid>
<Grid Grid.Row="1" DataContext="{StaticResource departmentViewSource}" Name="grid2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Label Content="Name:" Grid.Column="0" Grid.Row="0" HorizontalAlignment="Left" Margin="3" VerticalAlignment="Center" />
<TextBox Grid.Column="1" Grid.Row="0" Height="23" HorizontalAlignment="Left" Margin="3" Name="nameTextBox" Text="{Binding Path=Name, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}" VerticalAlignment="Center" Width="120" />
</Grid>
</Grid>
</Window>
public partial class MainWindow : Window
{
private SchoolEntities _context = new SchoolEntities(@"data source=localhost\MSSQL2008R2;database=SchoolModel;integrated security=True;MultipleActiveResultSets=True");
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
System.Windows.Data.CollectionViewSource departmentViewSource =
((System.Windows.Data.CollectionViewSource)(this.FindResource("departmentViewSource")));
// Load is an extension method on IQueryable, defined in the System.Data.Entity namespace.
// This method enumerates the results of the query, much like ToList but without creating a list.
// When used with Linq to Entities this method creates the entity instances and adds to the context.
_context.Departments.Load(); // Load is defined in the System.Data.Entity namespace.
// After the data is loaded call the DbSet<T>.Local property to use the DbSet<T> as a binding source.
departmentViewSource.Source = _context.Departments.Local;
var src = _context.Departments.Local;
ICollectionView colelctionView = CollectionViewSource.GetDefaultView(src);
colelctionView.Filter = new Predicate<object>(i => (i as Department).DepartmentID.ToString() == departmentIDTextBox.Text);
}
}