当前位置: 首页 > 知识库问答 >
问题:

ComboBox选择项目=null与DisplayMemerPath

邵轶
2023-03-14

在WPF组合框中,当使用DisplayMemberPath时,如何使ItemsSource中的空实例可选?

我绑定到对象集合并向该集合添加了 null。我还已将选定项绑定到属性。选择非 null 的值时,我的 SelectedItem 属性会正确更改。但是当我从下拉列表中选择空项时,我的 SelectedItem 属性不会更改。

我已经将其与DisplayMemberPath的使用隔离开来,也就是说,它不会发生在字符串集合中,因为您不会使用DisplayMenberPath。

这一切对我来说都有意义,因为没有DisplayMemberPath为空或空的对象实例,列表中只有一个空项。然而,我正试图找到最好的方法来提供一种清空组合框的方法。

我想我可以创建我的对象的一个实例,其中DisplayMemberPath属性的值是一个空字符串,但对我来说这似乎有点不太好。

有什么建议吗?

我的例子如下:

这是我正在填充我的 ItemsSource 的类:

public class Car
{
    public string Make { get; set; }

    public Car(string make)
    {
        Make = make;
    }

}

这是我的xaml:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <ComboBox SelectedItem="{Binding MyCar}" ItemsSource="{Binding MyCars}" DisplayMemberPath="Make" />
</Grid>

这是我背后的代码:

public partial class MainWindow : Window, INotifyPropertyChanged
{
    private Car myCar = null;

    public List<Car> MyCars { get; set; }

    public Car MyCar
    {
        get { return myCar; }
        set
        {
            if (myCar != value)
            {
                myCar = value;
                OnPropertyChanged("MyCar");
            }
        }
    }


    public MainWindow()
    {
        MyCar = null;

        MyCars = new List<Car>();
        MyCars.Add(null);
        MyCars.Add(new Car("Ford"));
        MyCars.Add(new Car("Chevy"));
        MyCars.Add(new Car("Toyota"));

        InitializeComponent();

    }


    #region INotifyPropertyChanged
    /// <summary>
    /// Occurs when a property value changes.
    /// </summary>
    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;

    /// <summary>
    /// This function is used to raise an PropertyChanged event.
    /// </summary>
    /// <param name="prop">The name of the property whose value changed.</param>
    internal void OnPropertyChanged(string prop)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(prop));
        }
    }
    #endregion

}

共有2个答案

余弘新
2023-03-14
 private string[] Logo_menu_array = { "Assets/star-6-48.ico", "/Assets/note-48.ico", "/Assets/medal-48.ico", "/Assets/joystick-48.ico" };
    private string[] Text_menu_array={"Phổ biến trên YouTuBe","Âm nhạc","Thể thao","Trò chơi"};






    public class listboxitem
    {
        public string textmenu { get; set; }
        public string logomenu { get; set; }
    }



public List<listboxitem> Load_Menu()
    {
        List<listboxitem> text = new List<listboxitem>();
        for (int i = 0; i < Math.Min(Logo_menu_array.Length, Text_menu_array.Length); i++)
        {
            var l = new listboxitem();
            l.logomenu = Logo_menu_array[i];
            l.textmenu = Text_menu_array[i];
            text.Add(l);
        }

        return text;
    }

public MainPage()
    {
        this.InitializeComponent();
        //get menu
         List<listboxitem> menu_list = Load_Menu();
         lst_menu.ItemsSource = menu_list;


    }
朱典
2023-03-14

添加(在VB中,所以你需要转换)一个

Public Overrides Function ToString() As String
    If string.isnullorwhitespace(Make) then
        return "no Car"
    else
        return make
    end if
End Function

添加到您的car类中,那么就不需要使用displaymemberpath,看看它的行为是否像字符串的itemssource

 类似资料:
  • 我在视觉工作室中有一个特定的组合框问题。我使用它让用户在组合框的文本框部分中键入文本,这会立即启动 SQL 请求。结果应显示在组合框的下拉列表部分中。(DropDownStyle 设置为 DropDown) 但是只要下拉菜单打开,第一个项目就会被选中,它的整个文本就会粘贴到文本框中。因此,如果你开始在一行中写多个字母,第一个字母“消失”,因为第二个键入的字母替换了选定的文本。 我知道有一个类似的帖

  • 问题内容: 如果选择了一个不同的值,组合框将触发一个事件。我还希望能够收听被选中的SAME项(即valueProperty不变)。似乎没有办法做到这一点。 我尝试扩展ComboBox并找到一种方法来监听关闭的小弹出菜单,但我什至无法访问它!我能做什么? 这是我正在尝试的: 问题答案: 更改值之前,可能会触发此事件处理程序。

  • wx.ComboBox对象提供了可供选择的项列表。 它可以配置为下拉列表或永久显示。 列表中的选定项目显示在文本字段中,默认情况下该文本字段是可编辑的,但可以在wx.CB_READONLY样式参数的情况下设置为只读。 wxPython API包含一个wx.Choice class ,其对象也是一个永久只读的下拉列表。 wx.ComboBox类构造函数使用的参数是 - Wx.ComboBox(par

  • 我使用JFoenix库来创建组合框。 “boxLeague。getSelectionModel()。选择EditeProperty()。addListener((可观察、旧值、新值)- }

  • 我的WPF应用程序中有一个ComboBox,我在其中显示项目列表。大多数情况下,第一个项目是项目资源列表中的正确选择,只有在个人请求时,才能更改项目。现在,“我的”组合框加载列表,但从不显示所选项目的第一个项目。有人能帮我吗。这是我的代码。 XAML: 代码隐藏: 我在 itemsSource 中有值,已选择的 itme 也有一个值,但永远不会显示在屏幕上。 感谢任何帮助。

  • 本文向大家介绍C#(WinForm) ComboBox和ListBox添加项及设置默认选择项,包括了C#(WinForm) ComboBox和ListBox添加项及设置默认选择项的使用技巧和注意事项,需要的朋友参考一下 Web控件DropDownList和WinForm控件ComboBox机制不一样。 ComboBox没有对应的ListItem需要自己写一个: 然后可以类似DropDownList