使用DisplayMemberPath的ComboBox SelectedItem = null

时间:2014-08-08 19:34:28

标签: c# wpf combobox

在WPF ComboBox中,如何在使用DisplayMemberPath时使ItemsSource中的null实例可选?

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

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

这对我来说是有意义的,因为没有我的对象的实例,其中DisplayMemberPath为空或null,列表中只有一个空项。但是,我试图找到最好的方法来提供一个空白ComboBox的方法。

我想我可以创建一个我的对象的实例,其中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 个答案:

答案 0 :(得分:0)

添加(在VB中,因此您需要转换)a

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

到你的汽车类然后不需要使用displaymemberpath并查看它是否像字符串的itemssource

答案 1 :(得分:0)

 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;


    }