启动时选择列表中的第一个组合框项目
本文关键字:第一个 组合 项目 选择 列表 启动 | 更新日期: 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"/>