1

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 (一方向) バインディングは正常に動作しています。

4

1 に答える 1

0

ボタン クリック ハンドラーで、バインドされた項目にブール値を設定し、listBox のデータ テンプレート セレクターを再バインドします。

        ListBoxItem currentItem = (ListBoxItem)(listBox1.ItemContainerGenerator.ContainerFromItem(listBox1.Items.CurrentItem));
        Activity activityItem = (Activity)listBox1.Items[listBox1.SelectedIndex]; 
        activityItem.ShowFeedbackForm = 1;
        listBox1.ItemTemplateSelector = new ActivityFeedDataTemplateSelector();

ブール値が設定されている場合、私の ActivityFeedDataTemplateSelector は目的のテンプレート名を返します。

于 2012-08-02T14:02:13.023 に答える