启动时选择列表中的第一个组合框项目

本文关键字:第一个 组合 项目 选择 列表 启动 | 更新日期: 2023-09-27 18:21:32

更新1

这不是关于"启动时选择nTH项目"。。。这更像是选择被定义为初始项目的项目,并更新组合框。我需要将ItemsSource设置为CompositeCollection,其中一个项被定义为指定项(不必是项0),并在启动时将提到的项设置为选定项。绑定设置到项目内容的事实在这里起着至关重要的作用。下面的代码只是演示了一个示例应用程序。

更新1结束

我遇到了一个小问题,我希望能在这里找到解决方案。我有一个组合框,我想用启动时选择的特定项目初始化它。问题是,当我启动应用程序时,控件是空的,并且在第一次打开时获取它的值。我已经设法将有问题的代码提取到最简单的形式(尽可能多地排除变量),它看起来如下

窗口的XAML代码

<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"
xmlns:loc ="clr-namespace:WpfApplication1"
x:Class="WpfApplication1.MainWindow"
x:Name="Window"
Title="MainWindow"
Width="640" Height="480">
<StackPanel Orientation="Vertical">
    <StackPanel.Resources>
        <ComboBoxItem x:Key="toSelectInitially" Content="{Binding Path=ActiveItem,   Mode=OneWay}"/>
    </StackPanel.Resources>
    <ComboBox SelectedIndex="0"
              Height="30">
        <ComboBox.ItemsSource>
            <x:Array Type="{x:Type ComboBoxItem}">
                <ComboBoxItem Content="{Binding Path=ActiveItem, Mode=OneWay}"/>
                <ComboBoxItem Content="AAA"/>
                <ComboBoxItem Content="BBB"/>
            </x:Array>
        </ComboBox.ItemsSource>
    </ComboBox>
    <ComboBox SelectedItem="{StaticResource ResourceKey=toSelectInitially}"
              Height="30" Loaded="ComboBox_Loaded">
        <ComboBox.ItemsSource>
            <x:Array Type="{x:Type ComboBoxItem}">
                <StaticResource ResourceKey="toSelectInitially"/> 
                <ComboBoxItem Content="AAA"/>
                <ComboBoxItem Content="BBB"/>
            </x:Array>
        </ComboBox.ItemsSource>
    </ComboBox>
    <ComboBox SelectedValue="{Binding Path=ActiveItem, Mode=OneWay}"
              SelectedValuePath="Content"
              Height="30">
        <ComboBox.ItemsSource>
            <x:Array Type="{x:Type ComboBoxItem}">
                <ComboBoxItem Content="{Binding Path=ActiveItem, Mode=OneWay}"/>
                <ComboBoxItem Content="AAA"/>
                <ComboBoxItem Content="BBB"/>
            </x:Array>
        </ComboBox.ItemsSource>
    </ComboBox>
</StackPanel>

</Window>

代码背后:

namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        this.InitializeComponent();
        this.DataContext = new VMSimple();
    }
}
}

简单视图模型:

using System;
using System.ComponentModel;
namespace WpfApplication1
{
class VMSimple : INotifyPropertyChanged
{
    public VMSimple()
    {
        ActiveItem = string.Concat("Active Item : ", Guid.NewGuid().ToString());
    }
    private string mActiveItem;
    public string ActiveItem
    {
        get { return mActiveItem; }
        private set
        {
            if (Equals(mActiveItem, value)) return;
            mActiveItem = value;
            OnPropertyChanged("ActiveItem");
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}
}

我试着让代码复制粘贴工作。

显然,所有方法的行为都是相同的(选定的值、索引、项目)。如果我将list设置为Items而不是ItemsSource,问题就会消失,它可以工作,但这不是一个选项。请记住,这是对更复杂代码的简化表示,我尝试使用CompositeCollection,但我用数组替换了它,以检查这是否不是问题的根源。

启动时选择列表中的第一个组合框项目

下面是我如何设置第一个组合框项目的完整示例:

XAML

   <ComboBox ItemsSource="{Binding Path=ComboItems}" SelectedItem="{Binding Path=SelectedItem, Mode=TwoWay}"/>

VIEWMODEL

 public class ViewModel : INotifyPropertyChanged
{
    private List<string> m_ComboItems= new List<string>();
    private string m_SelectedItem;
    public ViewModel()
    {
        m_ComboItems.Add("AA");
        m_ComboItems.Add("BB");
        m_ComboItems.Add("CC");
        this.SelectedItem = m_ComboItems.First<string>();
    }
    public List<string> ComboItems
    {
        get { return m_ComboItems;}            
    }
    public string SelectedItem
    {
        get { return m_SelectedItem; }
        set
        {
            m_SelectedItem = value;
            this.OnPropertyChanged("SelectedItem");
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

如果您想将selectedItem更改为列表中第一个项目以外的其他项目,则需要将selectedItem设置为列表中的对象,例如selectedItem=m_ComboItems[1]将把"BB"作为所选项目。

希望这能有所帮助!

如果您希望在您的组合框的itemSource初始化后立即选择您的第一个项目,请将您的组合盒的IsSynchronizedWithCurrentItem设置为true,如下所示-

<ComboBox IsSynchronizedWithCurrentItem="True"/>