わかりました、2 つのデータ テンプレートを作成したコンテナーがあります。基本的に、1 つのテンプレートは 5 つのテキスト ボックスとそれにバインドされたオブジェクト データを表示し、もう 1 つのテンプレートはその特定のオブジェクトを追加するためのボタンを表示します。私は DataTemplateSelector をサブクラス化し、それは機能しますが、レコードをナビゲートすると、セレクターが再び呼び出されることはありません。
では、コンテナがそのテンプレートを再選択するにはどうすればよいでしょうか。コンテナーは StackPanel であり、私は既に UpdateVisuals、InvalidateVisuals、InvalidateArrange、および ApplyTemplate を試しました。
XAML コード
<DataTemplate x:Key="advisorTemplate">
<StackPanel Orientation="Vertical" Margin="2,2,2,2" HorizontalAlignment="Stretch" VerticalAlignment="Top">
<StackPanel Orientation="Horizontal" Margin="2,2,2,2" HorizontalAlignment="Center">
<extToolkit:WatermarkTextBox Name="txtAcadAdv" Watermark="Acad Adv" Width="125" Margin="2" Text="{Binding Path=Adv.AcadAdv}"/>
<extToolkit:WatermarkTextBox Name="txtProgAdv" Watermark="Prog Adv" Width="125" Margin="2" Text="{Binding Path=Adv.ProgAdv}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="2,2,2,2" HorizontalAlignment="Center">
<extToolkit:WatermarkTextBox Name="txtPortAdv" Watermark="Port Adv" Width="125" Margin="2" Text="{Binding Path=Adv.PortAdv}"/>
<extToolkit:WatermarkTextBox Name="txtEleTws" Watermark="Ele Tws" Width="125" Margin="2" Text="{Binding Path=Adv.EleTws}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="2,2,2,2" HorizontalAlignment="Center">
<extToolkit:WatermarkTextBox Name="txtMatTws" Watermark="Mat Tws" Width="125" Margin="2" Text="{Binding Path=Adv.MatTws}"/>
</StackPanel>
</StackPanel>
</DataTemplate>
<DataTemplate x:Key="addAdvisor">
<Button HorizontalAlignment="Center" VerticalAlignment="Center" Margin="2" Name="btnAddAdvisor" Click="ButtonClick" Content="Add Advisor"/>
</DataTemplate>
グループボックスの変更内容の初期化
grpAdv.ContentTemplateSelector = _advisorSelector;
そして最後にセレクターコード
private readonly StudentWin _win;
public AdvisorDataTemplateSelector(StudentWin win)
{
_win = win;
}
public override System.Windows.DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container)
{
var sp = item as StackPanel;
var adv = sp.DataContext as Advisor;
if (adv == null)
return _win.FindResource("addAdvisor") as DataTemplate;
return _win.FindResource("advisorTemplate") as DataTemplate;
}
そして、これが私のナビゲーションコードのスニペットです
case "btnNext":
{
if(_view.CurrentPosition < _view.Count - 1)
{
CheckForUnusedReferences(_view.GetItemAt(_view.CurrentPosition) as Student);
_view.MoveCurrentToNext();
CheckForNullReferences(_view.CurrentPosition);
grpAdv.ApplyTemplate();
}
}
追加の 2 つのメソッドは、生徒の関係が null であるかどうかを確認することです。関係が作成され、データ コンテキストに追加されます。それ以外の場合、Entity Framework は変更を保存しません。上記のデータ テンプレートは基本的に、新しい学生を作成しようとしたときに学生 ID がないという問題を解決するのに役立ちます。