wpf 应用程序中的自定义组合框选定文本
Custom combobox selected text within wpf application
我有一个 wpf 应用程序,其中我遇到了这个问题:
<UserControl.Resources>
<ItemsPanelTemplate x:Key="VSP">
<VirtualizingStackPanel
VirtualizingPanel.CacheLength="20"
VirtualizingPanel.ScrollUnit="Item"
VirtualizingPanel.VirtualizationMode="Recycling"
VirtualizingPanel.IsVirtualizing="True"/>
</ItemsPanelTemplate>
<DataTemplate x:Key="ExpertTemplate">
<Grid Width="640">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="160"/>
<ColumnDefinition Width="160"/>
<ColumnDefinition Width="160" />
<ColumnDefinition Width="160"/>
</Grid.ColumnDefinitions>
<Label Content="{Binding fsign_id}" Grid.Column="0" />
<Label Content="{Binding fsign_civilite}" Grid.Column="1" />
<Label Content="{Binding fsign_nom}" Grid.Column="2" />
<Label Content="{Binding fsign_prenom}" Grid.Column="3" />
</Grid>
</DataTemplate>
</UserControl.Resources>
.............
<DataGrid x:Name="grid" ItemsSource="{Binding Entitites}" SelectedValue="{Binding SelectedValue}" >
<DataGrid.Resources>
<Style TargetType="DataGridCell">
<Setter Property="HorizontalAlignment" Value="Center" />
</Style>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTemplateColumn Header="Participant" Width="200">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<skin:ParticipantExpert SelectedValue="{Binding SelectedElement, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" ItemsPanel="{StaticResource VSP}" ItemTemplate="{DynamicResource ExpertTemplate }" Width="220" ItemsSource="{Binding ExpertCollection}" >
</skin:ParticipantExpert>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
自定义组合框:
public class ParticipantExpert : ComboBox
{
public ParticipantExpert()
{
}
protected override void OnSelectionChanged(SelectionChangedEventArgs e)
{
if (SelectedItem == null) { return; }
vue_groupe_participant CurrentItem = (vue_groupe_participant)SelectedItem;
Text = CurrentItem.fsign_nom + " " + CurrentItem.fsign_prenom;
}
}
我在这一行设置了一个断点if (SelectedItem == null) { return; }
。当我 select 来自组合框的一个元素时,事件被引发两次!第一个 SelectedItem
是 selected 对象,但在第二个中它采用 null 作为值。
所以我需要知道:
- 为什么事件被引发两次?
- 如何修复我的代码?
谢谢,
你可以用 ItemTemplate
我的 ComboBox
看起来像这样:
<ComboBox Margin="12,6,12,0" SelectedIndex="{Binding DatabaseIndex, Mode=TwoWay}"
ItemsSource="{Binding Databases}"
ItemTemplate="{StaticResource DatabaseComboTemplate}"/>
ItemTemplate
看起来像这样:
<DataTemplate x:Key="DatabaseComboTemplate" DataType="ItemTemplate">
<StackPanel Orientation="Horizontal" Height="20">
<Image Source="/AppWPF;component/Images/DatabaseImage.ico" Height="16" Width="16"/>
<Label Content="{Binding DatabaseDisplayString}" Margin="0,-3,0,0"/>
</StackPanel>
</DataTemplate>
输出如下所示:
安德鲁·斯蒂芬斯是正确的。您必须从处理程序中删除文本分配。您尝试显示的文本必须是绑定为 SelectedItem 的对象的 属性。
您需要阅读更多 ComboBox.Text
这是重要的部分
Setting the Text property to a value that is not in the collection leaves the SelectedIndex unchanged.
这意味着您必须向绑定对象添加一个 属性,以便为控件提供您想要显示的文本。不允许创建原本不属于绑定对象的文本 属性。
我有一个 wpf 应用程序,其中我遇到了这个问题:
<UserControl.Resources>
<ItemsPanelTemplate x:Key="VSP">
<VirtualizingStackPanel
VirtualizingPanel.CacheLength="20"
VirtualizingPanel.ScrollUnit="Item"
VirtualizingPanel.VirtualizationMode="Recycling"
VirtualizingPanel.IsVirtualizing="True"/>
</ItemsPanelTemplate>
<DataTemplate x:Key="ExpertTemplate">
<Grid Width="640">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="160"/>
<ColumnDefinition Width="160"/>
<ColumnDefinition Width="160" />
<ColumnDefinition Width="160"/>
</Grid.ColumnDefinitions>
<Label Content="{Binding fsign_id}" Grid.Column="0" />
<Label Content="{Binding fsign_civilite}" Grid.Column="1" />
<Label Content="{Binding fsign_nom}" Grid.Column="2" />
<Label Content="{Binding fsign_prenom}" Grid.Column="3" />
</Grid>
</DataTemplate>
</UserControl.Resources>
.............
<DataGrid x:Name="grid" ItemsSource="{Binding Entitites}" SelectedValue="{Binding SelectedValue}" >
<DataGrid.Resources>
<Style TargetType="DataGridCell">
<Setter Property="HorizontalAlignment" Value="Center" />
</Style>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTemplateColumn Header="Participant" Width="200">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<skin:ParticipantExpert SelectedValue="{Binding SelectedElement, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" ItemsPanel="{StaticResource VSP}" ItemTemplate="{DynamicResource ExpertTemplate }" Width="220" ItemsSource="{Binding ExpertCollection}" >
</skin:ParticipantExpert>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
自定义组合框:
public class ParticipantExpert : ComboBox
{
public ParticipantExpert()
{
}
protected override void OnSelectionChanged(SelectionChangedEventArgs e)
{
if (SelectedItem == null) { return; }
vue_groupe_participant CurrentItem = (vue_groupe_participant)SelectedItem;
Text = CurrentItem.fsign_nom + " " + CurrentItem.fsign_prenom;
}
}
我在这一行设置了一个断点if (SelectedItem == null) { return; }
。当我 select 来自组合框的一个元素时,事件被引发两次!第一个 SelectedItem
是 selected 对象,但在第二个中它采用 null 作为值。
所以我需要知道:
- 为什么事件被引发两次?
- 如何修复我的代码?
谢谢,
你可以用 ItemTemplate
我的 ComboBox
看起来像这样:
<ComboBox Margin="12,6,12,0" SelectedIndex="{Binding DatabaseIndex, Mode=TwoWay}"
ItemsSource="{Binding Databases}"
ItemTemplate="{StaticResource DatabaseComboTemplate}"/>
ItemTemplate
看起来像这样:
<DataTemplate x:Key="DatabaseComboTemplate" DataType="ItemTemplate">
<StackPanel Orientation="Horizontal" Height="20">
<Image Source="/AppWPF;component/Images/DatabaseImage.ico" Height="16" Width="16"/>
<Label Content="{Binding DatabaseDisplayString}" Margin="0,-3,0,0"/>
</StackPanel>
</DataTemplate>
输出如下所示:
安德鲁·斯蒂芬斯是正确的。您必须从处理程序中删除文本分配。您尝试显示的文本必须是绑定为 SelectedItem 的对象的 属性。
您需要阅读更多 ComboBox.Text
这是重要的部分
Setting the Text property to a value that is not in the collection leaves the SelectedIndex unchanged.
这意味着您必须向绑定对象添加一个 属性,以便为控件提供您想要显示的文本。不允许创建原本不属于绑定对象的文本 属性。