首页 > 解决方案 > 如何在 C# WPF 中有一个多列下拉框?

问题描述

我正在尝试在 c# wpf 中创建一个多列组合框,如下所示。有任何想法吗?

在此处输入图像描述

选择一行时,仅显示州代码,但所有详细信息都可以显示在下拉选择中。

标签: c#.netwpfxamlcombobox

解决方案


你可以有点创意并解决这个问题。假设您有一个只有 60 像素宽的组合框。因此,您希望组合项目显示为完整的州名称和缩写,例如CA - California,但如果选中,您只需要缩写。CA.

我声明一个类来表示这样的状态:

public class State
{
    public string ShortName { get; set; }
    public string FullName { get; set; }
    private string _displayName;
    public string DisplayName
    {
        set
        {
            _displayName = value;
        }
        get
        {
            if (string.IsNullOrEmpty(_displayName))
                return string.Format("{0} - {1}", ShortName, FullName);
            else
                return _displayName;
        }
    }
}

诀窍是您用来DisplayName在组合框中显示项目。然后,在getof 中DisplayName,如果它已经有一个值,则返回它,如果没有,则连接状态的短名称和全名。

然后,当您进行数据绑定时,您有一个状态列表以及一个SelectedState,并且在该属性的设置器中,您将 设置DisplayNameShortName

所以,我的XAML

<Grid>
    <ComboBox ItemsSource="{Binding States}"
              SelectedValue="{Binding SelectedState}"
              DisplayMemberPath="DisplayName"
              Name="CmbStates" Width="60" Height="32"/>
</Grid>

然后,在我的代码中:

public partial class MainWindow : Window, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    private List<State> _states;
    public List<State> States
    {
        get { return _states; }
        set
        {
            _states = value;
            OnPropertyChanged("States");
        }
    }

    private State _selectedState;
    public State SelectedState
    {
        get { return _selectedState; }
        set
        {
            _selectedState = value;
            SelectedState.DisplayName = SelectedState.ShortName;
            OnPropertyChanged("SelectedState");
        }
    }

    public MainWindow()
    {
        InitializeComponent();
        States = new List<State>
        {
            new State() { FullName = "California", ShortName = "CA" },
            new State() { FullName = "New York", ShortName = "NY" },
            new State() { FullName = "Oregon", ShortName = "OR" }
        };
        DataContext = this;
    }
}

现在您应该在列表中有完整的串联名称:

在此处输入图像描述

但只有选择时的缩写:

在此处输入图像描述


推荐阅读