【问题标题】:Custom combobox selected text within wpf applicationwpf应用程序中的自定义组合框选定文本
【发布时间】:2015-11-13 08:30:38
【问题描述】:

我有一个 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. 如何修复我的代码?

谢谢,

【问题讨论】:

  • 是因为Text = ... 行吗?当您设置 ComboBox 的 Text 属性时,它具有更改选择的效果。
  • 你能描述一下,为什么需要自定义ComboBox?看起来您只需要更改一些样式或模板。
  • @AndrewStephens 我该如何解决这个问题?

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


【解决方案1】:

安德鲁斯蒂芬斯是正确的。您必须从处理程序中删除文本分配。您尝试显示的文本必须是绑定为 SelectedItem 的对象的属性。

您需要阅读更多关于ComboBox.Text 的信息

这是重要的部分

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

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

【讨论】:

    【解决方案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>
    

    输出如下所示:

    【讨论】:

    • 请重新阅读我使用的代码 ItemTemplate 。我需要自定义选择后组合框中显示的文本(当弹出窗口关闭时)
    猜你喜欢
    • 2013-04-29
    • 2015-04-21
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    相关资源
    最近更新 更多