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