在启动时选择列表中的第一个ComboBox项

时间:2012-01-26 08:53:46

标签: c# wpf combobox wpf-controls

更新1

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

END OF UPDATE 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();
    }
}
}

简单ViewModel:

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,但我已将其替换为数组,以检查这是否导致问题。

2 个答案:

答案 0 :(得分:2)

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

<强> XAML

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

<强>视图模型

 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”作为所选项目。

希望这有帮助!

答案 1 :(得分:2)

如果你想在你的组合框初始化itemSource后立即选择你的第一个项目,请将你的组合框的IsSynchronizedWithCurrentItem设置为true -

<ComboBox IsSynchronizedWithCurrentItem="True"/>