自定义组合框在wpf应用程序中选择了文本

时间:2015-11-13 08:30:39

标签: c# .net wpf mvvm mvvm-light

我有一个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; }中加了一个断点。当我从组合框中选择一个元素时,事件会被提升两次!!第一个SelectedItem是选定的对象,但在第二个中,它将null作为值。

所以我需要知道:

  1. 为什么会举两次活动?
  2. 如何修复我的代码?
  3. 谢谢,

2 个答案:

答案 0 :(得分:0)

您可以使用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>

输出如下:

enter image description here

答案 1 :(得分:0)

Andrew Stephens是对的。您必须从处理程序中删除文本的分配。您要显示的文本必须是绑定为SelectedItem的对象的属性。

您需要了解ComboBox.Text

的更多内容

这是重要的部分

  

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

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