C# wpf应用程序中的自定义组合框选定文本

C# wpf应用程序中的自定义组合框选定文本,c#,.net,wpf,mvvm,mvvm-light,C#,.net,Wpf,Mvvm,Mvvm Light,我有一个wpf应用程序,其中存在以下问题: <UserControl.Resources> <ItemsPanelTemplate x:Key="VSP"> <VirtualizingStackPanel VirtualizingPanel.CacheLength="20" Virtuali

我有一个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>
如果(SelectedItem==null){return;},我在这一行
中放置了一个断点。当我从组合框中选择一个元素时,事件将引发两次!!第一个
SelectedItem
是所选对象,但第二个对象的值为null

所以我需要知道:

  • 为什么这项活动被提了两次
  • 如何修复我的代码

  • 谢谢,

    您可以使用
    ItemTemplate

    我的
    组合框
    如下所示:

    <ComboBox Margin="12,6,12,0" SelectedIndex="{Binding DatabaseIndex, Mode=TwoWay}" 
                      ItemsSource="{Binding Databases}" 
                      ItemTemplate="{StaticResource DatabaseComboTemplate}"/>
    
    <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>
    
    输出如下所示:

    <ComboBox Margin="12,6,12,0" SelectedIndex="{Binding DatabaseIndex, Mode=TwoWay}" 
                      ItemsSource="{Binding Databases}" 
                      ItemTemplate="{StaticResource DatabaseComboTemplate}"/>
    
    <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>
    

    您可以使用
    ItemTemplate

    我的
    组合框
    如下所示:

    <ComboBox Margin="12,6,12,0" SelectedIndex="{Binding DatabaseIndex, Mode=TwoWay}" 
                      ItemsSource="{Binding Databases}" 
                      ItemTemplate="{StaticResource DatabaseComboTemplate}"/>
    
    <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>
    
    输出如下所示:

    <ComboBox Margin="12,6,12,0" SelectedIndex="{Binding DatabaseIndex, Mode=TwoWay}" 
                      ItemsSource="{Binding Databases}" 
                      ItemTemplate="{StaticResource DatabaseComboTemplate}"/>
    
    <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的对象的属性

    你需要读更多的书

    这里是重要的部分

    将Text属性设置为不在集合中的值会使SelectedIndex保持不变


    这意味着您必须向绑定对象添加一个属性,该属性为控件提供要显示的文本。不允许创建最初不是绑定对象一部分的文本属性。

    Andrew Stephens是正确的。您必须从处理程序中删除文本赋值。您试图显示的文本必须是绑定为SelectedItem的对象的属性

    你需要读更多的书

    这里是重要的部分

    将Text属性设置为不在集合中的值会使SelectedIndex保持不变


    这意味着您必须向绑定对象添加一个属性,该属性为控件提供要显示的文本。不允许创建最初不是绑定对象一部分的文本属性。

    这是因为
    Text=…
    行吗?当您设置组合框的文本属性时,它具有更改选择的效果。您能描述一下,为什么需要自定义
    组合框
    ?看起来您只需要更改一些样式或模板。@AndrewStephens如何解决这个问题?是因为
    Text=…
    行吗?当您设置组合框的文本属性时,它具有更改选择的效果。您能描述一下,为什么需要自定义
    组合框
    ?看起来您只需要更改一些样式或模板。@AndrewStephens如何解决此问题?请重新阅读我使用的代码
    ItemTemplate
    。选择后(当弹出窗口关闭时),我需要自定义组合框中显示的文本。请重新读取我使用的代码
    ItemTemplate
    。我需要自定义选择后组合框中显示的文本(当弹出窗口关闭时)