我可以在 xaml 代码中禁用 WPF 组合框的第一项吗?
Can I disable the first item a WPF combobox within xaml code?
考虑以下组合框:
<ComboBox ItemsSource="{Binding Presets.VolumePresetList}" SelectedIndex="{Binding VolumePresetSelectedIndex, UpdateSourceTrigger=PropertyChanged}" Margin="10, 10" HorizontalAlignment="Left"
MinWidth="150">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBox Text="{Binding PresetName, UpdateSourceTrigger=Explicit}" VerticalAlignment="Center" Height="20" BorderThickness="0" LostFocus="TextBox_LostFocus" KeyUp="TextBox_KeyUp"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
组合框的第一项是默认预设,在文本框中具有相应的默认名称。因此,用户不应该能够对第一项进行输入 - 因此我想禁用第一项的文本框。
我知道我可以 运行 包含 class 或视图模型的构造函数中的一个函数,它禁用第一个索引上的文本框,但是我想知道这是否可能直接在 xaml 代码中(我会找到一种更优雅的方式来做这些静态的事情)。
我已经用 DataBinding
为 ListView
创建了一个复合集合,但逻辑是相同的:
<ListView SelectedValue="{Binding youVMPropertyHere}">
<ListView.ItemsSource>
<CompositeCollection>
<ListViewItem IsHitTestVisible="False">Default Item</ListViewItem>
<CollectionContainer Collection="{Binding Source={StaticResource cvsPresetLists}}"/>
</CompositeCollection>
</ListView.ItemsSource>
<!-- Where-->
<Window.Resources>
<CollectionViewSource Source="{Binding Presets.VolumePresetList}" x:Key="cvsPresetLists"/>
</Window.Resources>
这样你就可以让第一个项目不可选。我也会使用 SelectedValue
而不是 SelectedIndex
.
您可以利用 PreviousData RelativeSource 将 return null
作为集合的第一个元素这一事实。知道您可以将 DataTrigger 添加到您的 DataTemplate 以将 TextBox
的 IsEnabled
属性 设置为 false。
这是带有 PreviousData
绑定的 ItemTemplate
的简化版本:
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBox x:Name="TextBox" />
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=PreviousData}}"
Value="{x:Null}">
<Setter TargetName="TextBox" Property="IsEnabled" Value="False" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ComboBox.ItemTemplate>
考虑以下组合框:
<ComboBox ItemsSource="{Binding Presets.VolumePresetList}" SelectedIndex="{Binding VolumePresetSelectedIndex, UpdateSourceTrigger=PropertyChanged}" Margin="10, 10" HorizontalAlignment="Left"
MinWidth="150">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBox Text="{Binding PresetName, UpdateSourceTrigger=Explicit}" VerticalAlignment="Center" Height="20" BorderThickness="0" LostFocus="TextBox_LostFocus" KeyUp="TextBox_KeyUp"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
组合框的第一项是默认预设,在文本框中具有相应的默认名称。因此,用户不应该能够对第一项进行输入 - 因此我想禁用第一项的文本框。
我知道我可以 运行 包含 class 或视图模型的构造函数中的一个函数,它禁用第一个索引上的文本框,但是我想知道这是否可能直接在 xaml 代码中(我会找到一种更优雅的方式来做这些静态的事情)。
我已经用 DataBinding
为 ListView
创建了一个复合集合,但逻辑是相同的:
<ListView SelectedValue="{Binding youVMPropertyHere}">
<ListView.ItemsSource>
<CompositeCollection>
<ListViewItem IsHitTestVisible="False">Default Item</ListViewItem>
<CollectionContainer Collection="{Binding Source={StaticResource cvsPresetLists}}"/>
</CompositeCollection>
</ListView.ItemsSource>
<!-- Where-->
<Window.Resources>
<CollectionViewSource Source="{Binding Presets.VolumePresetList}" x:Key="cvsPresetLists"/>
</Window.Resources>
这样你就可以让第一个项目不可选。我也会使用 SelectedValue
而不是 SelectedIndex
.
您可以利用 PreviousData RelativeSource 将 return null
作为集合的第一个元素这一事实。知道您可以将 DataTrigger 添加到您的 DataTemplate 以将 TextBox
的 IsEnabled
属性 设置为 false。
这是带有 PreviousData
绑定的 ItemTemplate
的简化版本:
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBox x:Name="TextBox" />
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=PreviousData}}"
Value="{x:Null}">
<Setter TargetName="TextBox" Property="IsEnabled" Value="False" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ComboBox.ItemTemplate>