SelectedItem的不同UI和Silverlight ComboBox的ItemTemplate

时间:2009-06-19 03:09:32

标签: c# xaml silverlight-3.0

基本上我只是在SL3 ComboBox中寻找'SelectedItemTemplate'。不幸的是,那不存在。

我想要的是SelectedItem看起来像这样:值

下拉框中的项目如下所示:值+额外信息

后者很容易通过使用ItemTemplate完成,但SelectedItem也是如此。我该如何预防/解决这个问题?

3 个答案:

答案 0 :(得分:3)

您可以通过创建自己的SelectionBoxItemTemplate附加属性,然后为ComboBox定义新的样式/控件模板,该模板在内容呈现器中为选择框区域使用该模板。

这是一个合适的附属物:

public class ComboBoxExt
{
    public static DataTemplate GetSelectionBoxItemTemplate(DependencyObject obj)
    {
        return (DataTemplate) obj.GetValue(SelectionBoxItemTemplateProperty);
    }

    public static void SetSelectionBoxItemTemplate(DependencyObject obj, DataTemplate value)
    {
        obj.SetValue(SelectionBoxItemTemplateProperty, value);
    }

    public static readonly DependencyProperty SelectionBoxItemTemplateProperty =
        DependencyProperty.RegisterAttached("SelectionBoxItemTemplate", typeof (DataTemplate), typeof (ComboBoxExt),
                                            new PropertyMetadata(null));

}

要更新ComboBox控件模板,请在名为ContentPresenter的文件中查找名为ContentPresenterBorder的元素(您可以找到ComboBox here的默认样式)。您需要删除ContentPresenter的名称(否则ComboBox将通过代码显式设置其属性的值,忽略您设置的数据绑定)。

以下是调整后的控件模板中的ContentPresenter元素的外观:

<ContentPresenter Margin="{TemplateBinding Padding}" 
                  Content="{Binding Path=SelectedItem, RelativeSource={RelativeSource TemplatedParent}}"
                  ContentTemplate="{Binding (a:ComboBoxExt.SelectionBoxItemTemplate), RelativeSource={RelativeSource TemplatedParent}}"
                  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
</ContentPresenter>

最后,要使用它,你会做类似的事情:

<ComboBox 
   Style="{StaticResource MyAdjustedComboBoxStyle}"
   ItemTemplate="{StaticResource MyDropDownAreaTemplate}"
   Behaviors:ComboBoxExt.SelectionBoxItemTemplate="{StaticResource MySelectionAreaTemplate}">

答案 1 :(得分:1)

您是否在寻找. SelectionBoxItemTemplate

答案 2 :(得分:0)

SelectionBoxItemTemplate在Silverlight4中可用,但无法从代码隐藏中设置此属性的值,因为它是只读属性。它也不是依赖属性,因此无法使用comboBox.SetValue()方法设置值。有关如何在代码隐藏中为此属性赋值的任何想法吗?