C# 获取组合框所选项目 公共部分类主窗口:窗口 { 公共主窗口() { 初始化组件(); loadUserCB(); } 私有void loadUserCB() { SqlDbConnect sdc=新的SqlDbConnect(); 数据集ds=新数据集(); SqlQuery(“select*fromtuser”); ds=sdc.QueryEx(“TUserDS”); UserCB.DataContext=ds; 字符串selUserName=UserCB.SelectedItem.ToString();//此代码无法获取所选项目 } } }

C# 获取组合框所选项目 公共部分类主窗口:窗口 { 公共主窗口() { 初始化组件(); loadUserCB(); } 私有void loadUserCB() { SqlDbConnect sdc=新的SqlDbConnect(); 数据集ds=新数据集(); SqlQuery(“select*fromtuser”); ds=sdc.QueryEx(“TUserDS”); UserCB.DataContext=ds; 字符串selUserName=UserCB.SelectedItem.ToString();//此代码无法获取所选项目 } } },c#,wpf,C#,Wpf,在MainWindow.xaml中,我创建了一个组合框,然后在MainWindow.xaml.cs中,我将组合框与Sqlserver中的一个表绑定。 如何从UserCB combobox获取所选项目?我认为您应该尝试使用MVVM框架 由于绑定基于notify而不是active,因此在非MVVM框架的情况下,如果直接修改DataContext。All has bound属性不知道DataContext已更新,因此它们的值不会更改 通过MVVM框架,使用实现INotifyPropertyChange

在MainWindow.xaml中,我创建了一个组合框,然后在MainWindow.xaml.cs中,我将组合框与Sqlserver中的一个表绑定。
如何从UserCB combobox获取所选项目?

我认为您应该尝试使用MVVM框架

由于绑定基于notify而不是active,因此在非MVVM框架的情况下,如果直接修改DataContext。All has bound属性不知道DataContext已更新,因此它们的值不会更改

通过MVVM框架,使用实现INotifyPropertyChanged接口的ViewModel将在属性更改时通知所有相关的绑定属性,从而避免数据上下文更新的问题

简单的例子:

<ComboBox ItemsSource="{Binding Path=TUserDS}" x:Name="UserCB" 
SelectionChanged="UserCB_SelectionChanged" Width="200" 
HorizontalAlignment="left" SelectedIndex="0" Padding="2" Margin="0 10 0 0">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="{Binding Path=UserName}"/>
            </StackPanel>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            loadUserCB();
        }

        private void loadUserCB()
        {
            SqlDbConnect sdc = new SqlDbConnect();
            DataSet ds = new DataSet();
            sdc.SqlQuery("select * from TUser");
            ds=sdc.QueryEx("TUserDS");
            UserCB.DataContext = ds;

            string selUserName = UserCB.SelectedItem.ToString(); //this code failed to get the selected item

        }
    }
}


*:DataSet不支持索引器,但“DataSet.Tables”支持索引器


由于ComboBox.ItemsSource收到VM.Ds属性更改通知,因此它将尝试更新自己的数据

如果您想坚持当前的设计,请尝试将Xaml更改为

<!--Xaml Code-->
<!--                            V Note here.*-->
<ComboBox ItemsSource="{Binding Tables[TUserDS]}" 
          x:Name="UserCB" 
          SelectionChanged="UserCB_SelectionChanged" 
          Width="200" 
          HorizontalAlignment="left"
          SelectedIndex="0" 
          Padding="2"
          Margin="0 10 0 0">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="{Binding UserName}"/>
            </StackPanel>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>


更多信息

在这种情况下,您有名称组合框->
UserCB

在类
主窗口中

  • 使用参考
    UserCB。在任何方法中选择editem
  • 要获取项目索引,请使用参考
    UserCB.SelectedIndex
    。对于小列表,您可以通过这种方式下载索引,并在此基础上从项目集合或数据库中读取值

(当您使用此内容调用函数时,您将获得当前值)

您是否尝试过
string selUserName=UserCB.SelectedValue?如果文本和值相同,那么您也可以执行
string selUserName=UserCB.text是的,但SelectedValue也返回null。但是,我可以设置UserCB.SelectedIndex=3或任何数字来选择我想要的用户。但我不知道如何获取所选项目的字符串。您使用的设计模式已过时。您可以了解MVVM。您可能想了解一下,我尝试在“UserCB.DataContext=ds”之后设置SelectedIndex,但即使在这之后,SelectedItem仍然返回Null。我在阅读您的答案后了解了MVVM,并一直方便地使用它。谢谢你的建议。
<!--Xaml Code-->
<!--                            V Note here.*-->
<ComboBox ItemsSource="{Binding Tables[TUserDS]}" 
          x:Name="UserCB" 
          SelectionChanged="UserCB_SelectionChanged" 
          Width="200" 
          HorizontalAlignment="left"
          SelectedIndex="0" 
          Padding="2"
          Margin="0 10 0 0">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="{Binding UserName}"/>
            </StackPanel>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>
<ComboBox ItemsSource="{Binding Path=TUserDS}" x:Name="UserCB" SelectionChanged="UserCB_SelectionChanged" Width="200" 
HorizontalAlignment="left" SelectedIndex="0"  Padding="2" Margin="0 10 0 0"
DisplayMemberPath="UserName"/>