[.net] 如何在Silverlight的組合框中使用不同的模板來選擇和下拉狀態?


Answers

你可以用ItemsContainerStyle來實現這個。 添加您的TextBlock和圖像,而不是ContentPresenter。 添加VisualStateManager並根據VSM的Selected狀態切換Image控件的可見性。

Question

我似乎無法為ComboBoxItem設置ContentTemplate。 有原因,我試圖做到這一點是我想有兩個出現在我的數據在組合框中。 當組合框打開(菜單向下)時,我需要一個文本框(圖像名稱)和一個圖像控件。 當我選擇我想讓組合框只顯示圖像名稱的文本框。

我想我可以通過修改組合框的ItemTemplate和ItemContainerStyle來實現這一點。 ItemContainerStyle包含以下ContentPresenter:

<ContentPresenter HorizontalAlignment="Left" Margin="{TemplateBinding Padding}" x:Name="contentPresenter" Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/>

所以我認為我可以在這裡設置ContentTemplate,它會工作。 但我似乎無法得到它的工作:

<DataTemplate x:Key="ComboBoxDataTemplate">
            <Grid>
                <TextBlock Text="{Binding Path='Name'}"/>
            </Grid>
        </DataTemplate>

<DataTemplate x:Key="ComboBoxItemTemplate">
            <StackPanel>
                <TextBlock Text="{Binding Path='Name'}"/>
                <Image Source="{Binding Path='Source'}" Width="64" Height="64"/>
            </StackPanel>
        </DataTemplate>

        <Style x:Key="ComboBoxItemStyle1" TargetType="ComboBoxItem">
...
            <Setter Property="ContentTemplate" Value="{StaticResource ComboBoxItemTemplate}"/>

...

這是我的組合框:

<ComboBox Width="70" Margin="3,0,0,0"
                        ItemsSource="{StaticResource Source}"
                        ItemTemplate="{StaticResource ComboBoxDataTemplate}"
                        ItemContainerStyle="{StaticResource ComboBoxItemStyle1}"
                        />

我唯一可以得到這個工作的方法是從ItemContainerStyle中刪除ContentPresenter,並將其替換為我的自定義模板(ComboBoxItemTemplate)的內容。 但我不認為我應該使用這種方法,因為這意味著ContentPresenter不再存在(並且ComboBox中的代碼可能依賴於它的存在)。

任何幫助顯示組合框與不同的下拉菜單和選定的模板將不勝感激!