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 作为值。

所以我需要知道:

  1. 为什么事件被引发两次?
  2. 如何修复我的代码?

谢谢,

你可以用 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.

这意味着您必须向绑定对象添加一个 属性,以便为控件提供您想要显示的文本。不允许创建原本不属于绑定对象的文本 属性。