通过数据绑定 WPF/MVVM 从数据库填充的组合框中获取选定值,以进行比较

Getting the selected value from a combobox populated from a data base, for comparison, through data binding WPF/ MVVM

我是C#初学者;该项目是在 Visual Studio (wpf) 中使用 entity framework 和视图模型制作的。我从我的数据库中填充了一个仅包含 'Employees' 名称的组合框。我想要做的是在变量中获取 selected 项目值(或直接将其与存储在数据库中的名称进行比较,以获取与该名称关联的所有其他 table 列;在我的如果我有年龄,属性..等)

如果我直接进入MainWindow.xaml.cs,我可以轻松使用

Object selectedItem = ComboBoxName.SelectedItem; 它完成了工作。但是,我需要在我的 MainWindowsViewModel.cs 中实现它。我发现了 SelectedItem="{Binding ..., Mode=...}" 并尝试了几种解决方案,但我找不到任何可行的方法。

我的组合框在 XAML:

 <ComboBox x:Name="comboPersonal" Grid.Column="6" HorizontalAlignment="Left" Margin="13,60,-62,0" Grid.Row="1" VerticalAlignment="Top" Width="183" ItemsSource="{Binding ang1}" SelectedItem="{Binding Path=Employers, Mode=TwoWay}"  />

组合框是这样填充的:

 public IList<string> ang1
        {
            get
            {
                using (ProbaHotel_1Entities db = new ProbaHotel_1Entities())
                {
                    var employee = db.Personal.Select(ang => ang.Nume).ToList();



                    return employee.ToList();
                }
            }
        }

在我的 MainWindowViewModel 中(大部分是错误的):

 public IList<string> Employers
        {
            get
            {
                using (ProbaHotel_1Entities db = new ProbaHotel_1Entities())
                {
                    var vNume = db.Personal.Select(ang => ang.Nume);
                    this.NumeText = vNume.ToString();

                }
                return this.Employers;
            }

            set { }
        }

NumeText 是文本框绑定到的变量。当我 select ComboBox 中的一个项目时,我希望将该值传输到文本框。 Select 语句缺少 WHERE 来比较 selected valuenames in the database

文本框XAML:

<TextBox x:Name="text_nume" HorizontalAlignment="Left" Height="23"  TextWrapping="Wrap" Text="{Binding NumeText}" VerticalAlignment="Top" Width="89" Grid.Column="1" Grid.Row="0" />

在我的 MainWindowViewModel 中:

private string numeText;
        public string NumeText
        {
            get
            {
                return this.numeText;
            }
            set
            {

                this.numeText = value;
            }
        }

您可以使用包含模型的 List 并绑定到组合框 itemsource,您可以绑定 DisplayMemberPath 说 "Name" 即模型的 属性 并将 SelectedItem 绑定到该模型。

请看代码。我使用了虚拟字符串值。在您的情况下,这应该像您提到的那样从数据库中填充。请注意,在 SelectedEmployee 的 setter 中,我根据您的要求为 NumText 赋值。一旦选定的项目发生变化,这将被分配并显示在 XAML 文本框

在您的情况下,您错误地将 SelectedItem 分配给了 list 。它应该与您绑定的 itemsource 有关。您创建了单独的列表,一个用于项目来源,另一个用于所选项目。而且我在您的代码中看不到与 INotifyPropertyChanged 相关的 属性 setter 的任何更改。

XAML :

<Window x:Class="WpfApplication13.MainWindow"
        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"
        xmlns:local="clr-namespace:WpfApplication13"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="50*"/>
            <RowDefinition Height="50*"/>
        </Grid.RowDefinitions>
        <TextBox x:Name="text_nume" HorizontalAlignment="Center" Height="23"  TextWrapping="Wrap" Text="{Binding NumeText}" VerticalAlignment="Center" Width="89" Grid.Row="0" />
        <ComboBox x:Name="comboPersonal" Grid.Row="1" Height="30" Width="100" HorizontalAlignment="Center" DisplayMemberPath="Name" VerticalAlignment="Center" Margin="13,60,-62,0"  ItemsSource="{Binding Ang1}" SelectedItem="{Binding SelectedEmployee}"  />
    </Grid>
</Window>

视图模型:

 public class ViewModel : INotifyPropertyChanged
    {

        #region Constants and Enums

        #endregion

        #region Private and Protected Member Variables 
        private IList<EmployeeModel> ang1;
        EmployeeModel _selectedEmployee;
        private string numeText;
        #endregion

        #region Private and Protected Methods
        private void OnPropertyChanged(string propName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
        }
        #endregion

        #region Constructors
        public ViewModel()
        {
            Ang1 = new List<EmployeeModel>();
            Ang1.Add(new EmployeeModel() {  Name="1"});
            Ang1.Add(new EmployeeModel() { Name = "2" });
        }
        #endregion

        #region Public Properties
        public IList<EmployeeModel> Ang1
        {
            get
            {
                return ang1;
            }
            set
            {
                ang1 = value;
                OnPropertyChanged(nameof(Ang1));
            }
        }

        public EmployeeModel SelectedEmployee
        {
            get
            {
                return _selectedEmployee;
            }
            set
            {
                _selectedEmployee = value;
                NumeText = value.Name;
                OnPropertyChanged(nameof(SelectedEmployee));
            }
        }

        public string NumeText
        {
            get
            {
                return this.numeText;
            }
            set
            {

                this.numeText = value;
                OnPropertyChanged(nameof(NumeText));
            }
        }
        #endregion

        #region Public Methods
        public event PropertyChangedEventHandler PropertyChanged;

        #endregion


    }

型号:

 public class EmployeeModel
    {
        public string Name { get; set; }
    }

我使用 INotifyPropertyChanged 进行绑定通知。让我知道这是否有帮助