Wpf Comboxbox可选默认项

问题描述:

我有一个comboxbox,它是一个来自我的viewmodel的observablecollection的数据绑定。我可以让我的列表填充数据,但我也想添加一个默认项目,如“--All Models--”。下面的代码显示“--All Models--”作为默认项目,但如果您选择另一个项目则无法选择。Wpf 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> 

我试过了compositecollection,但似乎没有工作。有没有办法做到这一点?

在此先感谢!

将视图交互逻辑构建到视图模型中。我的建议使Observable集合类型为由源列表填充的视图模型,再加上另一个“未选定”项目的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 })); 
    } 
} 

然后你就可以处理的SelectedItem的ID与空思迈特。

您可以将您的集合通用类型更改为object并在那里添加 - 所有模型 - 的东西。

+0

我怀疑这是一个可行的选择... – 2011-04-22 15:05:30

CompositeCollection应该工作,如果你知道如何使用它;一个重要的事情是它继承DataContext,这意味着你需要引用你的来源以其他方式,进一步如果该方法是x:Reference你可能不会创建一个循环引用,这可以通过放置在引用的元素的资源中收集。例如

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

然后你可以通过ItemsSource="{StaticResource compCollection}"来使用它。

+0

这是一个更简洁的答案。从MVVM的角度来看更清晰。 – Oliver 2012-02-17 09:07:41