如果组合框是打开的WPF,如何显示复杂的项目描述

时间:2016-03-22 12:08:13

标签: c# wpf combobox

我正在寻找解决问题的技巧或解决方案。也许你们其中一个人可能会给我一些建议?

结构

所以我的组合框的代码如下:

        <GridViewColumn Header="{lex:LocText CurrentWordCode}" controls:CustomColumnInfo.Name="CurrentWordCode">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox x:Name="ToolsComboBox" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0,0,0,0"
                               SelectedItem="{Binding SelectedCurrentWord}" ItemsSource="{Binding AvailbleWords}" DisplayMemberPath="Item1"  />

                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>

        <GridViewColumn Header="{lex:LocText CurrentWordName}" DisplayMemberBinding="{Binding SelectedCurrentWord.Item2}" 
                        controls:CustomColumnInfo.Name="CurrentWordName"/>

然后SelectedCurrentWord是

    private Tuple<string,string, string> _SelectedCurrentWord;
    public Tuple<string,string, string> SelectedCurrentWord
    {
        get { return _SelectedCurrentWord; }
        set { _SelectedCurrentWord = value;
            OnPropertyChanged("SelectedCurrentWord");
        }
    }

我正在创建上述对象:

SelectedCurrentWord = new Tuple<string, string, string>(CurrentWordCode, CurrentWordName, CurrentWordCode + " - " + CurrentWordName)

ItemSource是这样的:

AvailbleWords = new List<Tuple<string, string, string>>();

现在:

enter image description here

现在图像的第一列包含Code(Tuple中的第一个字符串),第二列包含Name(Tuple中的第二个字符串)。我的问题是,从组合框中选择项目的用户不知道选择哪个项目,因为只看到代码,而不是项目的名称。

用途

enter image description here

我的目的是在CurrentWordCode列中用户看到代码,在CurrentWordName列中,用户看到此项的名称。这是暂时完成的。但是当用户点击combox然后我想向他展示如下格式的项目:&#34; Code&#34; +&#34; - &#34; +&#34;名称&#34;,不像现在只显示代码。

因此我在Tuple结构中创建了第三个项目,并且有#34; Code&#34; +&#34; - &#34; +&#34;名称&#34;但问题是如果选择组合框中的项目并打开组合框,那么在组合框中显示的选定项目也采用这种格式,但必须只有一个&#34;代码&#34;。

很抱歉复杂的描述,如果不清楚我在寻找什么,那么请问问题,我会尝试更好地描述它。感谢advace的任何帮助。关心并度过美好的一天。

2 个答案:

答案 0 :(得分:1)

首先,你可以松开你元组中的第三个项目,这纯粹是为了显示目的而不应该存在,因为我们已经拥有了其他两个项目中我们需要的所有信息。

其次,您需要使用controltemplate告诉您的组合框如何显示它的内容。实际上你需要两个。一个用于所选项目,另一个用于下拉列表。然后,您可以使用datatemplate确保组合框处理两种情况。

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
            <ControlTemplate x:Key="SimpleTemplate">
                <StackPanel>
                    <TextBlock Text="{Binding Item1}" />
                </StackPanel>
            </ControlTemplate>
            <ControlTemplate x:Key="ExtendedTemplate">
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Item1}" />
                    <TextBlock Text="-" />
                    <TextBlock Text="{Binding Item2}" />
                </StackPanel>
            </ControlTemplate>
            <DataTemplate x:Key="TupleTemplate">
                <Control x:Name="theControl" Focusable="False" Template="{StaticResource ExtendedTemplate}" />
                <DataTemplate.Triggers>
                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ComboBoxItem}}, Path=IsSelected}" Value="{x:Null}">
                        <Setter TargetName="theControl" Property="Template" Value="{StaticResource SimpleTemplate}" />
                    </DataTrigger>
                </DataTemplate.Triggers>
            </DataTemplate>
    </Window.Resources>

<StackPanel>
    <ComboBox x:Name="ToolsComboBox" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0,0,0,0" Width="200"
                           SelectedItem="{Binding SelectedCurrentWord}" ItemsSource="{Binding AvailbleWords}" ItemTemplate="{StaticResource TupleTemplate}" />
</StackPanel>

答案 1 :(得分:0)

看起来您需要设置ComboBox的以下属性:

<ComboBox x:Name="ToolsComboBox" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0,0,0,0" SelectedItem="{Binding SelectedCurrentWord}" ItemsSource="{Binding AvailbleWords}" SelectedValuePath="Item1" SelectionBoxItemTemplate="{Path_to your template}"  />