使组合框在视图模型中可用

本文关键字:模型 视图 组合 | 更新日期: 2023-09-27 18:19:59

我在xaml文件中有一个组合框。通过将datacontext传递到我的视图模型文件。我想从我的视图模型文件中添加组合框上下文。我如何通过mvvm模式实现这一点

xaml代码

<ComboBox   Binding.XmlNamespaceManager="SelectNameCB"  
            FontSize="15" 
            Margin="10,0,0,0" 
            HorizontalAlignment="Left" 
            VerticalAlignment="Top" 
            Width="207" />

在视图模型文件中,SelectNameCB表示其在当前上下文中不可用。视图模型文件

private void ComboBoxdata()
{
    OleDbConnection ConDb;
    String eID;
    ConDb = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:''Users''Admin''Documents''Visual Studio 2012''Projects''Feedback''Feedback.accdb");
    try
    {
        ConDb.Open();
        OleDbCommand DBSelect = new System.Data.OleDb.OleDbCommand("select FName, LName,ID_NAME from NameList", ConDb);
        OleDbDataReader reader = DBSelect.ExecuteReader();

        while (reader.Read())
        {
            string eNAME = "";
            eID = reader["ID_NAME"].ToString();
            eNAME += reader["FName"].ToString();
            eNAME += " " + reader["LName"].ToString();
            SelectNameCB.Items.Add(eNAME);

        }
    }
    catch (Exception ae)
    {
        MessageBox.Show(ae.Message);
    }//catch
}

使组合框在视图模型中可用

首先,我认为您必须阅读更多关于MVVM模式的内容。ViewModel不应该知道任何关于视图(组合框所在的位置)的信息。

视图的DataContext设置为ViewModel,而不是相反。

view.DataContext = viewModel

如果您想用值填充组合框,请在viewModel 中添加一个属性

public ObervableCollection<string> Values {get; set;}

然后将组合框ItemsSource绑定到Values属性

<ComboBox ItemsSource="{Binding Values}" 
          SelectedItem="{Binding MySelectedItem, Mode=TwoWay}" />

还要将MySelectedItem弹出框添加到ViewModel中,以获得选定的值。(您也可以在ViewModel上实现INotifyPropertyChanged接口)

public string SelectedItem {get; set;}

现在,如果在ViewModel中设置Values属性,则组合框将获得数据列表。首先,从阅读器中填充一个List,然后将其用作ObservableCollection构造函数的参数。

Values = new ObervableCollection<string>(listOfeNAME);

试试这个:

private List<string> _MyComboBoxData;
public List<string> MyComboBoxData
{
    get
    {
        return _MyComboBoxData;
    }
    set
    {
        _MyComboBoxData = value;
        OnPropertyChanged(() => MyComboBoxData);
    }
}

还有这个:

ConDb.Open();
OleDbCommand DBSelect = new System.Data.OleDb.OleDbCommand("select FName, LName,ID_NAME from NameList", ConDb);
OleDbDataReader reader = DBSelect.ExecuteReader();
while (reader.Read())
{
    string eNAME = "";
    eID = reader["ID_NAME"].ToString();
    eNAME += reader["FName"].ToString();
    eNAME += " " + reader["LName"].ToString();
    MyComboBoxData.Add(eNAME);
}