listBox に 2 つのデータ テンプレートを定義しました。DataTemplateSelector を使用して、アイテムに対してどちらをレンダリングするかを決定しています。ただし、私のテンプレートの 1 つには、クリックするとフォームが表示される埋め込みボタンがあります。だから私はブール値のプロパティを設定し、INotifyPropertyChanged; を実装しました。boolean プロパティが true の場合、現在のテンプレートは 3 番目のテンプレートに置き換えられます。
ボタンのコードです。
Activity activityItem = (Activity)listBox1.Items[listBox1.SelectedIndex];
activityItem.ShowFeedbackForm = 1;
これは私のXAMLです:
<Grid.Resources>
<DataTemplate x:Key="completedActivityTemplate">
<Grid Name="templateGrid" >
...
<DataTemplate x:Key="activityTemplate">
<Grid Name="templateGrid" >
...
<DataTemplate x:Key="feedbackFormTemplate">
<Grid Name="templateGrid" >
...
<Style TargetType="ListBoxItem" x:Key="ContainerStyle">
<Setter Property="Height" Value="55" />
<Setter Property="Background" Value="Transparent" />
<Style.Triggers>
<Trigger Property="IsKeyboardFocusWithin" Value="True">
<Setter Property="IsSelected" Value="True" />
</Trigger>
<DataTrigger Binding="{Binding showFeedbackForm}" Value="1">
<Setter Property="ContentTemplate" Value="{StaticResource feedbackFormTemplate}" />
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Resources>
<ListBox Grid.Row="1" Name="listBox1" IsSynchronizedWithCurrentItem="True"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
VerticalContentAlignment="Stretch" Background="Transparent"
BorderThickness="0" ItemContainerStyle="{StaticResource ContainerStyle}"
HorizontalContentAlignment="Stretch" Margin="-3,0,0,0"
ItemTemplateSelector="{StaticResource myDataTemplateSelector}">
</ListBox>
そのため、ユーザーがボタンをクリックすると、その項目の ShowFeedbackForm に値 1 が設定されます。これは、フィードバック フォームを表示するテンプレートが表示されるが、何も起こらない場合です。私の ObservableCollection (一方向) バインディングは正常に動作しています。