Daniel Andrei Popescu Ответов: 1

Как связать значения combobox со значениями listbox в MVVM?


У меня есть combobox с 4 значениями,и для каждого значения в combobox список должен обновлять свои значения.Например,если у меня есть овощи и фрукты,то когда я выбираю фрукты в выпадающем списке, в списке должны отображаться все фрукты в меню.Как я могу это сделать с помощью MVVM?Я пытался сделать это с помощью запросов linq, но безуспешно.Может ли кто-нибудь объяснить мне, возможно ли это вообще, потому что, к сожалению, никто не сделал ничего подобного.Я нашел несколько примеров,близких к тому, что я хочу, но никакой помощи.

Я беру данные из базы данных,и у меня есть одна таблица,которая содержит 4 значения{courseID, courseName, SNTeacher и education}.

Это первый раз, когда я использую этот сайт, поэтому, пожалуйста, не судите...Спасибо!

Что я уже пробовал:

RegisterView.язык XAML.в CS
public partial class Register : Window
    {
        RegisterTeacherViewModel regTeacher;
        public Register()
        {
            InitializeComponent();
            regTeacher = new RegisterTeacherViewModel();
            this.DataContext = regTeacher;
            cbxCourses.ItemsSource =regTeacher.GetByEducation();
            coursesList.ItemsSource = regTeacher.MergeWithCombobox();
            
           
          
        }
      
     
        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            Hide();
        }

        private void fullName_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
        {

        }

        private void cbxCourses_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            regTeacher.CreateCrazy();
        }

RegisterTeacherViewModel.cs:
<pre lang="c#"><pre>   
 private DelegateCommand _showCourse;
        public DelegateCommand showCourse
        {
            get { return _showCourse; }
            set
            {
                if(_showCourse!=value)
                {
                    _showCourse = value;
                    NotifyOnPropertyChange("showCourse");
                }
            }
        }
   public RegisterTeacherViewModel()
        {
            ButtonCommand = new DelegateCommand(SaveTeacher);
            showCourse = new DelegateCommand(CreateCrazy);
        }

private void CreateCrazy(object obj)
        {

            using (DatabaseStudentsEntities1 db = new DatabaseStudentsEntities1())
            {
                try
                {
                    var query = from Cours in db.Courses
                                select new
                                {
                                    Education = Cours.education,
                                    CourseName = Cours.courseName

                                };
                    foreach (var education in query)
                    {
                        if (Education.Any(p => p.education == "ICT Engineering" && p.courseID < 2000))
                        {
                            courseName.ToList();
                        }
                    }
                }
                catch (Exception ex)

                {
                    MessageBox.Show(ex.Message);
                }

            }
        }





Это мой RegisterTeacher.язык XAML:
<pre>  <ComboBox HorizontalAlignment="Left" DataContextChanged="cbxCourses_DataContextChanged" x:Name="cbxCourses" SelectedItem="{Binding Education}" Margin="126,229.2,0,0" Grid.Row="1" VerticalAlignment="Top" DisplayMemberPath="education"  Width="228" Grid.RowSpan="2">

         <!--<StackPanel Orientation="Horizontal">
             <Image Source="https://www.frostburg.edu/fsu/assets/Image/dept/educ/education_sign_resized.jpg" Height="20"></Image>
             <TextBlock Text="Program"></TextBlock>
         </StackPanel-->
         <!-->-->

     </ComboBox>
     <Button Content="Submit"  HorizontalAlignment="Left" Margin="517,98.4,0,0" Grid.Row="2" VerticalAlignment="Top" Width="110" Height="40"/>
     <Button Content="Cancel"  HorizontalAlignment="Left" Margin="361,98.4,0,0" Grid.Row="2" VerticalAlignment="Top" Width="111" Height="40"/>
     <ListBox HorizontalAlignment="Left" Name="coursesList" Height="240"   Margin="418,13.2,0,0" Grid.Row="1" VerticalAlignment="Top" Width="225" Grid.RowSpan="2"  ItemsSource="{Binding CourseName}" IsSynchronizedWithCurrentItem="{Binding Education, Mode=TwoWay}"/>
     <Button Content="Show courses:" Command="{Binding Path=showCourse}" CommandParameter="{Binding ElementName=coursesList}" Click="Button_Click" HorizontalAlignment="Left" Margin="163,61.4,0,0" Grid.Row="2" VerticalAlignment="Top" Width="137" Height="35"/>

saimanisha

видите ли, я не знаю, как именно это сделать, но я просто обсуждал с вами, что я могу сказать вам, будет ли это благотворно или нет .когда u выбирает combobox, используя привязку к переменной .допустим, модель класса
выбор переменных

использование запроса выборки данных варибальной модели(это могут быть фрукты или имена домашних животных и т.д..)
связать полученные данные в список ..
добавьте список к itemsource из элемента управления ListView

Daniel Andrei Popescu

Ладно,интересный подход.Я попробую сейчас и дам вам знать!

Daniel Andrei Popescu

Прямо сейчас я попробовал это,ничего не изменится.
это мой метод:
Cours cr = новый курс();
строка запроса = "";

SqlConnection conn = new SqlConnection(@"Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=C:\\Users\\User\\source\repos\\VIAApp2Demo\\VIAApp2Demo\\DB\\DatabaseStudents.mdf;Интегрированная безопасность=True;время ожидания подключения=30");

Коннектикут.Открыть();
если (образование.Любой(п =&ГТ; п.образование == "машиностроение" &амп ИКТ;&амп; С. идентификатор_курса &ЛТ; 2000))
{
запрос = "курсы обновления установить courseName=@courseName и столбцами courseid=@идентификатор_курса ";
SqlCommand cmd = new SqlCommand(query, conn);
Объект sqlparameter Coursename= ЦМД.Параметры.AddWithValue("@courseName", SqlDbType.NVarChar);
cmd.Parameters["@courseName"].Value = courseName;
if (Coursename==null)
{
Курсовое имя.Значение = DBNull.Ценность;
}
SqlDataReader rd = cmd.Метода executereader();
пробовать
{
в то время как(РД.читать())
{
использование (DatabaseStudentsEntities1 db = new DatabaseStudentsEntities1())
{
courseName = db.Courses.Выберите(х =>, новые Куре() { courseName = С. courseName }).Список();
}
УМК.Метод executenonquery();
}
РД.Рядом();
}поймать(исключение бывший)
{
Ящик для сообщений.Показать(напр.сообщение);
}
}

#realJSOP

Я хочу ответить на этот вопрос, но не настолько сильно, чтобы настроить тестовый проект и проработать все детали. :)

Daniel Andrei Popescu

Привет,Джон,если ты знаешь,где я могу найти пример для своей проблемы или дать мне совет, этого будет более чем достаточно.Я пытался найти что-то актуальное повсюду в интернете,и самое худшее заключается в том, что я новичок в MVVM и WPF, так что любая помощь будет оценена по достоинству!

#realJSOP

Я предоставляю некоторый код, который вы могли бы использовать в моем ответе.

1 Ответов

Рейтинг:
9

#realJSOP

Я предполагаю, что у вас есть одна коллекция для combobox и одна для listbox.

В элемент коллекции listbox добавьте свойство IsVisible.

Когда ваш выбор combobox изменится, установите для вашего нового свойства IsVisible значение true или false, в зависимости от того, связан ли элемент с тем, что было выбрано в combobox.

Я получаю все свои элементы MVVM из базового класса под названием Notifiable. Этот класс реализует INotifyPropertyChanged и IDataErrorInfo интерфейсы и содержит несколько свойств, которые полезны в модели представления WPF. Я включил его сюда на случай, если вы сможете им воспользоваться. Если вы хотите увидеть его в использовании, проверьте мой SQLXAgent - задания для SQL Express[^] статья. Весь пользовательский интерфейс-это WPF, и я использую свой Notifiable класс экстенсивно.

using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;

namespace WpfCommon
{
    /// <summary>
    /// Base class for all objects that require notifiablity and data validation
    /// </summary>
    public class Notifiable : INotifyPropertyChanged, IDataErrorInfo
    {
        #region INotifyPropertyChanged

        /// <summary>
        /// Occurs when a property value changes.
        /// </summary>
        public event PropertyChangedEventHandler PropertyChanged;

        /// <summary>
        /// Notifies that the property changed, and sets IsModified to true.
        /// </summary>
        /// <param name="propertyName">Name of the property.</param>
        protected void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                if (propertyName != "IsModified")
                {
                    this.IsModified = true;
                }
            }
        }

        #endregion INotifyPropertyChanged

        #region IDataErrorInfo Code

        /// <summary>
        /// Gets an error message indicating what is wrong with this object.
        /// </summary>
        public string Error
        {
            get { return "Error"; }
        }

        /// <summary>
        /// Gets the error message for the property with the given name.
        /// </summary>
        /// <param name="columnName">Name of the column.</param>
        /// <returns>The generated error message (if any).</returns>
        public string this[string columnName]
        {
            get 
            {
                return Validate(columnName);
            }
        }

        /// <summary>
        /// Validates the specified propery.
        /// </summary>
        /// <param name="properyName">Name of the propery.</param>
        /// <returns>Empty string if valid, otherwise, appropriate error message.</returns>
        protected virtual string Validate(string propertyName)
        {
            //Retun error message if there is error, otherwise return empty string
            string validationMsg = string.Empty;
            return validationMsg;
        }

        #endregion IDataErrorInfo Code

        #region Fields

        private bool isModified;
        private bool isSelected;
        private bool isVisible;
        private bool isEnabled;
        private bool isExpanded;
        private bool isNew;
        private bool isClone;
        private bool isDeleted;
        private bool isValid;

        #endregion Fields

        #region Properties

        /// <summary>
        /// Gets or sets a value indicating whether this instance is modified.
        /// </summary>
        public virtual bool IsModified
        {
            get { return this.isModified; }
            set
            {
                if (this.isModified != value)
                {
                    this.isModified = value;
                    this.NotifyPropertyChanged("IsModified");
                }
            }
        }

        /// <summary>
        /// Gets or sets a value indicating whether this instance is selected.
        /// </summary>
        public virtual bool IsSelected
        {
            get { return this.isSelected; }
            set
            {
                if (this.isSelected != value)
                {
                    this.isSelected = value;
                    this.NotifyPropertyChanged("IsSelected");
                }
            }
        }

        /// <summary>
        /// Gets or sets a value indicating whether this instance is selected.
        /// </summary>
        public virtual bool IsExpanded
        {
            get { return this.isExpanded; }
            set
            {
                if (this.isExpanded != value)
                {
                    this.isExpanded = value;
                    this.NotifyPropertyChanged("IsExpanded");
                }
            }
        }

        /// <summary>
        /// Gets or sets a value indicating whether this instance is visible.
        /// </summary>
        public virtual bool IsVisible
        {
            get { return this.isVisible; }
            set
            {
                if (value != this.isVisible)
                {
                    this.isVisible = value;
                    this.NotifyPropertyChanged("IsVisible");
                }
            }
        }

        /// <summary>
        /// Gets or sets a value indicating whether this instance is enabled.
        /// </summary>
        public virtual bool IsEnabled
        {
            get { return this.isEnabled; }
            set
            {
                if (value != this.isEnabled)
                {
                    this.isEnabled = value;
                    this.NotifyPropertyChanged("IsEnabled");
                }
            }
        }

        /// <summary>
        /// Gets or sets a value indicating whether this instance is new.
        /// </summary>
        public virtual bool IsNew
        {
            get { return this.isNew; }
            set
            {
                if (value != this.isNew)
                {
                    this.isNew = value;
                    this.NotifyPropertyChanged("IsNew");
                }
            }
        }

        /// <summary>
        /// Gets or sets a value indicating whether this instance is a clone of an existing object.
        /// </summary>
        public virtual bool IsClone
        {
            get { return this.isClone; }
            set
            {
                if (value != this.isClone)
                {
                    this.isClone = value;
                    this.NotifyPropertyChanged("IsClone");
                }
            }
        }
        /// <summary>
        /// Get/set the flag indicating whether or not this item is marked for delete.
        /// </summary>
        public virtual bool IsDeleted
        {
            get { return this.isDeleted; }
            set
            {
                if (value != this.isDeleted)
                {
                    this.isDeleted = value;
                    this.NotifyPropertyChanged("IsDeleted");
                }
            }
        }

        /// <summary>
        /// Get or set a flag indicating whether or not this item has an error
        /// </summary>
        public virtual bool IsValid
        {
            get { return this.isValid; }
            set
            {
                if (value != this.isValid)
                {
                    this.isValid = value;
                    this.NotifyPropertyChanged("IsValid");
                }
            }
        }

        #endregion Properties

        #region Constructor

        /// <summary>
        /// Initializes a new instance of the <see cref="Notifiable"/> class.
        /// </summary>
        public Notifiable(bool isNew=false)
        {
            this.IsNew      = isNew;
            this.IsModified = false;
            this.IsVisible  = true;
            this.IsEnabled  = true;
            this.isValid    = true;
            this.IsClone    = false;
            this.IsDeleted  = false;
        }

        #endregion Constructor
    }
}