Wpf Combobox可选默认项

时间:2011-04-22 14:46:14

标签: wpf xaml combobox

我有一个从我的viewmodel数据绑定到observablecollection的comboxbox。我可以让我的列表填充数据,但我也想添加一个默认项目,如“ - 所有模型 - ”。下面的代码显示“ - 所有型号 - ”作为默认项目,但如果您选择其他项目则无法选择。

<ContentControl Content="{Binding Items}">
    <ContentControl.ContentTemplate>
        <DataTemplate>
            <Grid>
                <ComboBox x:Name="cb" ItemsSource="{Binding}"/>
                <TextBlock x:Name="tb" Text="--Choose One--" IsHitTestVisible="False" Visibility="Hidden"/>
            </Grid>
            <DataTemplate.Triggers>
                <Trigger SourceName="cb" Property="SelectedItem" Value="{x:Null}">
                    <Setter TargetName="tb" Property="Visibility" Value="Visible"/>
                </Trigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </ContentControl.ContentTemplate>
</ContentControl>

我尝试过使用复合集合,但似乎没有用。有没有办法实现这个目标?

提前致谢!

3 个答案:

答案 0 :(得分:4)

CompositeCollection应该有效,如果你知道如何使用它;关于它的一个重要的事情是它继承DataContext,这意味着您需要以其他方式引用您的源,如果该方法是x:Reference您可以不创建循环引用,可以通过将集合放在引用的元素的Resources中来避免这种情况。 e.g。

<Window.Resources>
    <CompositeCollection x:Key="compCollection">
        <ComboBoxItem Content="-- All Models --"/>
        <CollectionContainer Collection="{Binding MyCollection, Source={x:Reference Window}}"/>
    </CompositeCollection>
    ...
</Window.Resources>

然后您可以通过ItemsSource="{StaticResource compCollection}"

使用此功能

答案 1 :(得分:2)

将视图交互逻辑构建到viewmodel中。我的建议是使Observable集合类型为由源列表填充的viewmodel,再加上一个“未选择”项目的viewmodel。

类似

public class ItemViewModel
{
     public string Description { get; set; }
     public int Id { get; set; }
}

public class ViewModel : ViewModelBase
{        
    public ObservableCollection<ItemViewModel> Items { get; set; } // Bound to ContentControl

    private void Init()
    {
        Items = new ObservableCollection<ItemViewModel>();
        Items.Add(new ItemViewModel() { Description = "--choice one--" , Id = null });
        Items.AddRange(Model.Items.Select(i=> new ItemViewModel() { Description = i.Description , Id = i.Id }));
    }
}

然后您可以使用null sematic处理SelectedItem的Id。

答案 2 :(得分:0)

您可以将收藏品通用类型更改为object并添加 - 所有模型 - 事物。