マスター/詳細ビューを実装しています (MVVM も使用しようとしています)。マスターは、ListBox
5 つの異なるタイプのアイテムを含むものです (マスターではすべて同じフォーマットになっています)。詳細には、マスターで選択されたオブジェクトのタイプに応じて異なるフォーム フィールドがあります。DataTemplateSelector
このCodeProject チュートリアルに従って、を使用しています。で選択したアイテムに基づいて正しいテンプレートが選択されますListBox
が、奇妙な参照の問題があります。
Type1
マスターの の 1 つのアイテムから の別のアイテムに移動Type1
すると、両方ともまったく同じテンプレートを使用します。これは良さそうに聞こえますが、同じ参照であるため、最初のアイテムで進行中だったアニメーションはすべて 2 番目のアイテムに表示されます。あるビューのアニメーションが別のビューのテンプレートの使用から分離されるように、テンプレートを個別に適用するにはどうすればよいですか?
コードサンプル: (ContentControl
詳細を提示)
<ContentControl Content="{Binding Path=CVS.View.CurrentItem}">
<ContentControl.ContentTemplate>
<DataTemplate>
<vms:MyTemplateSelector Content="{Binding}">
<vms:MyTemplateSelector.Template1>
<DataTemplate>
<views:Type1View />
</DataTemplate>
</vms:MyTemplateSelector.Template1>
<vms:MyTemplateSelector.Template2>
<DataTemplate>
<views:Type2View />
</DataTemplate>
</vms:MyTemplateSelector.Template2>
<vms:MyTemplateSelector.Template3>
<DataTemplate>
<views:Type3View />
</DataTemplate>
</vms:MyTemplateSelector.Template3>
<vms:MyTemplateSelector.Template4>
<DataTemplate>
<views:Type4View />
</DataTemplate>
</vms:MyTemplateSelector.Template4>
<vms:MyTemplateSelector.Template5>
<DataTemplate>
<views:Type5View />
</DataTemplate>
</vms:MyTemplateSelector.Template5>
</vms:MyTemplateSelector>
</DataTemplate>
</ContentControl.ContentTemplate>
</ContentControl>
編集- アニメーション コードの追加
このアニメーション コードは、SelectionChanged イベントに作用する動作を通じて ComboBoxes で実行されます。これを実行する前に、ComboBox がフォーカスされているかどうかを確認します。このアニメーションは、フォーカスされていない場合にのみ発生し、以前の選択を変更する必要があるという視覚的なプロンプトとして機能します。
public void AnimateComboBox(ComboBox cbo)
{
LinearGradientBrush myBrush = new LinearGradientBrush();
myBrush = Extensions.Clone<LinearGradientBrush>(cbo.BorderBrush as LinearGradientBrush);
cbo.BorderBrush = myBrush;
Storyboard sb = new Storyboard();
sb.Duration = new Duration(TimeSpan.FromMilliseconds(3000));
foreach(GradientStop s in myBrush.GradientStops)
{
ColorAnimation anim = new ColorAnimation();
anim.To = Colors.Red;
anim.Duration = new Duration(TimeSpan.FromSeconds(0.5));
anim.AutoReverse = true;
anim.RepeatBehavior = RepeatBehavior.Forever;
Storyboard.SetTarget(anim, s);
Storyboard.SetTargetProperty(anim, new PropertyPath(GradientStop.ColorProperty));
sb.Children.Add(anim);
}
sb.Begin();
}
Extensions.Clone は、Silverlight フォーラムから提供されています。