我正在使用MVVM模式开发一个WPF应用程序,我有一个带有来自viewmodel的itemssource的组合框,我想在组合框中有一个默认选项,如“--Select user--”,最好的做法是什么这个。 这是我的XAML代码:
<ComboBox Grid.Column="1" HorizontalAlignment="Left" Margin="5.2,8.2,0,7.8" Grid.Row="5" Width="340" ItemsSource="{Binding Path=Users}" IsSynchronizedWithCurrentItem="True" SelectedItem="{Binding SelectedUser}" Grid.ColumnSpan="2">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} {1}">
<Binding Path="FirstName"/>
<Binding Path="LastName"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
答案 0 :(得分:0)
<ComboBox>
SelectedIndex="0"
<ComboBox.ItemsSource>
<CompositeCollection>
<ListBoxItem>Please Select</ListBoxItem>
<CollectionContainer Collection="{Binding Source={StaticResource YOURDATASOURCE}}" />
</CompositeCollection>
</ComboBox.ItemsSource>
答案 1 :(得分:0)
最简单的方法是在绑定列表/集合中包含此类项目。在视图模型中完成填充列表后,只需执行
myViewModel.Users.Insert(0, "--Select user--");
它是伪代码,所以请调整。
答案 2 :(得分:0)
另一种方法可以是触发器,让组合框就像它们一样
<Grid>
<ComboBox x:Name="mycombo" ItemsSource="{Binding}"/>
<TextBlock Text="-- Select User --" IsHitTestVisible="False" Visibility="Hidden">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=mycombo,Path=SelectedItem}" Value="{x:Null}">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</Grid>
或者,如果您能够将组合框的外观更改为可编辑的组合框,则可以执行此操作 -
<ComboBox IsEditable="True" IsReadOnly="True" Text="-- Select User --" />
答案 3 :(得分:0)
如果您使用的是MVVM,那么您的选择用户项目应该与您所有其他项目一起位于视图模型的集合中。有多种方法可以实现此目的,具体取决于数据项的类型。
如果您只是使用普通string
,那么很容易......只需在第一个索引中的数据绑定集合中添加一个字符串:
DataBoundCollection.Insert(0, "--Select user--");
如果您的数据类型是自定义类,那么您可以使用string
属性来显示项目的名称/标识符以保存该值:
DataBoundCollection.Insert(0, new YourDataType("--Select user--", null, null, 0, 0));
另一个选择是使DataBoundCollection
成为基本类型的集合。普通项应该派生此基类型,因此可以添加到此集合中。默认项可以是另一个派生类型(以便以不同方式显示),也可以添加到同一集合中:
// You could even hard code this text into the DefaultType object alternatively
DataBoundCollection.Add(new DefaultType("--Select user--"));
DataBoundCollection.Add(new YourDataType(...));
DataBoundCollection.Add(new YourDataType(...));
...
DataBoundCollection.Add(new YourDataType(...));
然后,您可以使用{em> not 设置ComboBox
指令的DataTemplate
在x:Key
中以不同方式显示它们:
<DataTemplate DataType="{x:Type Local:YourDataType}">
<!-- Define how your normal items are displayed here -->
</DataTemplate>
<DataTemplate DataType="{x:Type Local:DefaultType}">
<!-- Define how your default item is displayed here -->
</DataTemplate>