【问题标题】:How to programmatically set SelectedItem of a data-bound WPF ComboBox?如何以编程方式设置数据绑定 WPF ComboBox 的 SelectedItem?
【发布时间】:2010-08-17 09:45:08
【问题描述】:

问题:谁能提供一个完整的代码示例,说明如何在不使用 MyComboBox.SelectedIndex 的情况下以编程方式更改数据绑定 WPF ComboBox 的 SelectedItem?

代码示例:这是我目前拥有的。

XAML:

<Window x:Class="Wpf.ComboBoxDemo.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">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <ComboBox Name="MyComboBox" DisplayMemberPath="LastName" SelectedIndex="0"/>
    </Grid>
</Window>

代码隐藏:

using System.Collections.ObjectModel;
using System.Windows;

namespace Wpf.ComboBoxDemo
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            ObservableCollection<Person> myPersonList = new ObservableCollection<Person>();

            Person personJobs = new Person("Steve", "Jobs");
            Person personGates = new Person("Bill", "Gates");

            myPersonList.Add(personJobs);
            myPersonList.Add(personGates);

            MyComboBox.ItemsSource = myPersonList;

            // How do I programmatically select the second Person, i.e. "Gates"?
            // The best pratice must be to somehow to set something like IsCurrentlySelected on the model, so the view update automatically. But how?
            MyComboBox.SelectedIndex = 1; // This works, but is there no way without using the index?

        }

        private class Person
        {
            public string FirstName { get; set; }
            public string LastName { get; set; }

            public Person(string firstName, string lastName)
            {
                FirstName = firstName;
                LastName = lastName;
            }
        }
    }
}

类似问题:我当然先上网搜索,但没有找到任何帮助我的东西。

  • 更改 ViewModel 中枚举绑定组合框的 SelectedItem (MSDN)
  • 在 WPF (3.5sp1) 中以编程方式设置 ComboBox SelectedItem (Stack Overflow)

【问题讨论】:

    标签: c# wpf data-binding combobox


    【解决方案1】:

    在我的头顶(我可能错了),使窗口实现INotifyPropertyChanged并添加事件:

    namespace Wpf.ComboBoxDemo
    {
        public partial class MainWindow : Window, INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
    
            public MainWindow()
            {
    

    然后为当前选定的项目添加一个属性,通知更改:

            private Person _selected;
            public Person MySelected
            {
                get { return _selected; }
                set
                {
                    if (value != _selected)
                    {
                        _selected = value;            
                        if (PropertyChanged != null)
                        {
                            PropertyChanged(this,
                                new PropertyChangedEventArgs("MySelected"));
                        }
                    }
                }
            }
    

    现在绑定组合框(这里的绑定可以使用FindAncestor 更高级,但有时为了简单起见,我将数据上下文放在代码后面):

    XAML

            <ComboBox
                Name="MyComboBox"
                DisplayMemberPath="LastName"
                SelectedItem="{Binding MySelected}" />
    

    背后的代码

        public MainWindow()
        {
            InitializeComponent();
            // ...
    
            // this will cause the "MySelected" binding to target the correct property on this object
            MyComboBox.DataContext = this;
        }
    

    我认为它是这样的。我现在无法对其进行测试,但希望它能将您推向正确的方向。

    编辑:如果您想尝试“其他方式”的绑定方法。展开 SelectedItem 绑定,如下所示:

            <ComboBox
                Name="MyComboBox"
                DisplayMemberPath="LastName"
                SelectedItem="{Binding MySelected,
                    RelativeSource={RelativeSource FindAncestor,
                        AncestorType={x:Type Window}}}" />
    

    您现在可以跳过在后面的代码中设置DataContext

        public MainWindow()
        {
            InitializeComponent();
            // ...
    
            // this will cause the "MySelected" binding to target the correct property on this object
            //MyComboBox.DataContext = this;
        }
    

    这是因为FindAncestor 模式使ComboBox 自己找到它应该绑定到哪个属性的对象,而不是您具体说明。

    目前办公室的热门话题是这两种方式中哪种方式最好。对我来说,它只是更多的 XAML 和更少的代码(或相反),只需使用将代码放置在您可以轻松工作的地方的方法。我认为在某些情况下后者是首选的(例如当您在其他控件中包含数据绑定控件时),但我只是涉足,所以我还没有真正弄清楚这些部分。

    【讨论】:

    • 很高兴我能帮上忙。 :) 如果您想尝试一下,我添加了第二种绑定方法。该代码也没有经过测试,所以我希望我能有一些运气。
    • 现在我在 this.DataContext = myPersonlist (它不需要 ComboBox 有一个名字)和你的 FindAncestor 方法之间纠结,它根本不需要代码隐藏。
    猜你喜欢
    • 2011-01-15
    • 2011-11-01
    • 2015-06-28
    • 2010-10-24
    • 1970-01-01
    • 2023-03-09
    • 2011-03-07
    • 2017-11-09
    • 1970-01-01
    相关资源
    最近更新 更多