获取组合框所选项目

时间:2018-09-07 06:49:33

标签: c# wpf

<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

        }
    }
}

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

3 个答案:

答案 0 :(得分:0)

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

因为在非MVVM框架的情况下,如果直接修改DataContext,则绑定是基于通知而不是活动的。所有已绑定的属性将不知道DataContext已更新,因此它们的价值不会改变。

通过MVVM框架,使用实现INotifyPropertyChanged接口的ViewModel可以在属性更改时通知所有相关的绑定属性,从而避免了DataContext更新的问题。

简单的例子:

//C# Code
//Define a ViewModel
public class VM : INotifyPropertyChanged
{
    private DataSet _ds;

    public event PropertyChangedEventHandler PropertyChanged;
    public DataSet Ds
    {
        get => _ds;
        set
        {
            _ds = value;
            //Notify: Property "Ds" updated
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Ds"));
        }
    }
}

public MainWindow()
{
    DataContext = new VM();
    //set viewmodel to DataContext before InitializeComponent
    InitializeComponent();

    loadUserCB();
}

<!--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>

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

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

答案 1 :(得分:0)

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

<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"/>    

更多信息here

答案 2 :(得分:0)

在这种情况下,您的名称为ComboBox-> UserCB

MainWindow类中:

  • 以任何方法使用引用UserCB.SelectedItem
  • 要获取项目索引时,请使用引用UserCB.SelectedIndex。如果列表较小,则可以通过这种方式下载索引,并在此基础上从项目的集合或数据库中读取值

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