Получить ComboBox Выбранный предмет - PullRequest
0 голосов
/ 07 сентября 2018
<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 голосов
/ 07 сентября 2018

Если вы хотите придерживаться своего текущего дизайна, попробуйте изменить свой 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"/>    

Подробнее здесь

0 голосов
/ 07 сентября 2018

В этой ситуации у вас есть имя ComboBox -> UserCB

В классе MainWindow:

  • используйте ссылку UserCB.SelectedItem в любом методе
  • используйте ссылку UserCB.SelectedIndex, когда вы хотите получить индекс предмета.В случае небольших списков вы можете загрузить индекс таким способом и на этом основании прочитать значение из коллекции или базы данных элементов

(Когда вы вызываете функцию с этим контентом, вы будетеполучить текущее значение)

0 голосов
/ 07 сентября 2018

Я думаю, вы должны попытаться использовать MVVM framework.

Поскольку связывание основано на уведомлении, а не на активном, в случае не-MVVM-среды, если непосредственно изменить DataContext. Свойство all has bound не будет знать, что DataContext обновлен, поэтому их значение не изменится.

При использовании инфраструктуры MVVM использование ViewModel, реализующего интерфейс INotifyPropertyChanged, будет уведомлять все связанные свойства привязки при изменении свойства, избегая проблемы обновления 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, поэтому он попытается обновить свои собственные данные

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...