C# 如何使用ICommand将组合框事件绑定到viewmodel

C# 如何使用ICommand将组合框事件绑定到viewmodel,c#,wpf,xaml,mvvm,icommand,C#,Wpf,Xaml,Mvvm,Icommand,我对MVVM比较陌生,我想将我的视图绑定到视图模型。我有很多代码要从CodeBehind迁移到ViewModel类 我想做的是将ComboBox事件绑定到相应的ViewModel ICommand方法。我希望组合框在加载视图时显示“CompanyB”,并且当我进行选择时,组合框应该给我“CompanyA”、“CompanyB”和“CompanyC”作为选项进行选择 选择公司后,下面两个文本框的值 Nachbest.Empf_Ansprechpartner Nachbest.Empfaenger_

我对MVVM比较陌生,我想将我的视图绑定到视图模型。我有很多代码要从CodeBehind迁移到ViewModel类

我想做的是将ComboBox事件绑定到相应的ViewModel ICommand方法。我希望组合框在加载视图时显示“CompanyB”,并且当我进行选择时,组合框应该给我“CompanyA”、“CompanyB”和“CompanyC”作为选项进行选择

选择公司后,下面两个文本框的值

Nachbest.Empf_Ansprechpartner

Nachbest.Empfaenger_邮件

我们必须做出相应的改变

问题是,我的代码中,组合框和文本框都保持为空,而且组合框中也没有可供选择的内容

你能帮我找到我丢失的东西吗?提前感谢您的帮助

XAML(neueNachbestellung.XAML):

<Window>
    <Grid>
        <StackPanel Grid.Column="0" Margin="25,25,0,0" x:Name="leftStPnl">
            <ComboBox x:Name="cboxEmpfaenger" 
                      ItemsSource="{Binding Empf}" 
                      Text="{Binding Empfaenger}" 
                      FontSize="12" Width="150" Margin="118,0,0,0"                      
                      SelectedItem="{Binding SelValue}">
            </ComboBox>
            <TextBox x:Name="txtEmpfAnsprechpartner" DataContext="{Binding Nachbest}" Text="{Binding Empf_Ansprechpartner}" FontSize="12" IsEnabled="False" Width="150" Margin="50,0,0,0"/>    
            <TextBox x:Name="txtEmpfMail" DataContext="{Binding Nachbest}" Text="{Binding Empfaenger_Mail}" FontSize="12" IsEnabled="False" Width="150" Margin="73,0,0,0"/>
        </StackPanel>
    </Grid>
</Window>
public neueNachbestellung(string someId) 
{
    InitializeComponent();
    this.DataContext = new neueNachbestellungViewModel(someId);
}
public class neueNachbestellungViewModel: INotifyPropertyChanged
{
//public ICommand LoadCombobox => new DelegateCommand<object>(ExecuteLoadCombobox);
public ICommand ComboboxSelectionChanged => new DelegateCommand<object>(ExecuteComboboxSelectionChanged);
public Nachbestellung Nachbest { get; set; }
private object someObject; //DelegateCommand.cs requires an argument
private ObservableCollection<string> _empf;
        public ObservableCollection<string> Empf
        {
            get { return _empf; }
            set
            {
                _empf = value;
                OnPropertyChanged("Empf");
            }
        }
        private string _selValue = "CompanyB"; //default value
        public string SelValue  
        {
            get { return _selValue; }
            set
            {
                _selValue = value;
                OnPropertyChanged("SelValue");
 switch (SelValue)
    {

        case "CompanyA":
            {
                Nachbest.Empf_Ansprechpartner = "CompanyA";
                Nachbest.Empfaenger_Mail = "service@companyA.com";
            }
            break;

        case "CompanyB":
            {
                Nachbest.Empf_Ansprechpartner = "CompanyB";
                Nachbest.Empfaenger_Mail = "orders@companyB.com";
            }
            break;

        case "CompanyC":
            {
                Nachbest.Empf_Ansprechpartner = "CompanyC";
                Nachbest.Empfaenger_Mail = "info@companyC.com";
            }
            break;

        default:
            MessageBox.Show("Something went wrong with the company selection!");
            break;
    }
//setting the Empfaenger property here with the current selected value is necessary for the database insert later on!
Nachbest.Empfaenger = SelValue;
            }
        }

 public event PropertyChangedEventHandler PropertyChanged;
        public virtual void OnPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

public neueNachbestellungViewModel(string id)
{

    this.Artikel = new ArtikelViewModel();
    this.ArtikelList = new ObservableCollection<Artikel>();
    InitializeReorderModel(id);    
    ExecuteComboboxSelectionChanged(someObject);                        
}

public void InitializeReorderModel(string id)
{
    //set the MODEL
    this.Nachbest = new Nachbestellung();

    //Retrieve and set some values on *VIEW LOAD*!
    var dbOracle = new Datenbank();
    this.Nachbest.Bv = dbOracle.GetBauvorhaben(hv);
    this.Nachbest.Hv = hv;
    this.Nachbest.Bauleiter = dbOracle.GetBauleiter(hv);
    this.Nachbest.Projektleiter = dbOracle.GetProjektleiter(hv);
}

private void ExecuteComboboxSelectionChanged(object param)
{
    Empf = new ObservableCollection<string>()
    {
        "CompanyA",
        "CompanyB",
        "CompanyC"             
    };
Nachbest.Empf_Ansprechpartner = "CompanyB";
            Nachbest.Empfaenger_Mail = "orders@companyB.com";
            Nachbest.Empfaenger = SelValue; //if this is left out and there is no selection (just the default remaining unchanged!), Nachbest.Empfaenger will be null!
}
}

代码隐藏(neueNachbestellung.xaml.cs):

<Window>
    <Grid>
        <StackPanel Grid.Column="0" Margin="25,25,0,0" x:Name="leftStPnl">
            <ComboBox x:Name="cboxEmpfaenger" 
                      ItemsSource="{Binding Empf}" 
                      Text="{Binding Empfaenger}" 
                      FontSize="12" Width="150" Margin="118,0,0,0"                      
                      SelectedItem="{Binding SelValue}">
            </ComboBox>
            <TextBox x:Name="txtEmpfAnsprechpartner" DataContext="{Binding Nachbest}" Text="{Binding Empf_Ansprechpartner}" FontSize="12" IsEnabled="False" Width="150" Margin="50,0,0,0"/>    
            <TextBox x:Name="txtEmpfMail" DataContext="{Binding Nachbest}" Text="{Binding Empfaenger_Mail}" FontSize="12" IsEnabled="False" Width="150" Margin="73,0,0,0"/>
        </StackPanel>
    </Grid>
</Window>
public neueNachbestellung(string someId) 
{
    InitializeComponent();
    this.DataContext = new neueNachbestellungViewModel(someId);
}
public class neueNachbestellungViewModel: INotifyPropertyChanged
{
//public ICommand LoadCombobox => new DelegateCommand<object>(ExecuteLoadCombobox);
public ICommand ComboboxSelectionChanged => new DelegateCommand<object>(ExecuteComboboxSelectionChanged);
public Nachbestellung Nachbest { get; set; }
private object someObject; //DelegateCommand.cs requires an argument
private ObservableCollection<string> _empf;
        public ObservableCollection<string> Empf
        {
            get { return _empf; }
            set
            {
                _empf = value;
                OnPropertyChanged("Empf");
            }
        }
        private string _selValue = "CompanyB"; //default value
        public string SelValue  
        {
            get { return _selValue; }
            set
            {
                _selValue = value;
                OnPropertyChanged("SelValue");
 switch (SelValue)
    {

        case "CompanyA":
            {
                Nachbest.Empf_Ansprechpartner = "CompanyA";
                Nachbest.Empfaenger_Mail = "service@companyA.com";
            }
            break;

        case "CompanyB":
            {
                Nachbest.Empf_Ansprechpartner = "CompanyB";
                Nachbest.Empfaenger_Mail = "orders@companyB.com";
            }
            break;

        case "CompanyC":
            {
                Nachbest.Empf_Ansprechpartner = "CompanyC";
                Nachbest.Empfaenger_Mail = "info@companyC.com";
            }
            break;

        default:
            MessageBox.Show("Something went wrong with the company selection!");
            break;
    }
//setting the Empfaenger property here with the current selected value is necessary for the database insert later on!
Nachbest.Empfaenger = SelValue;
            }
        }

 public event PropertyChangedEventHandler PropertyChanged;
        public virtual void OnPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

public neueNachbestellungViewModel(string id)
{

    this.Artikel = new ArtikelViewModel();
    this.ArtikelList = new ObservableCollection<Artikel>();
    InitializeReorderModel(id);    
    ExecuteComboboxSelectionChanged(someObject);                        
}

public void InitializeReorderModel(string id)
{
    //set the MODEL
    this.Nachbest = new Nachbestellung();

    //Retrieve and set some values on *VIEW LOAD*!
    var dbOracle = new Datenbank();
    this.Nachbest.Bv = dbOracle.GetBauvorhaben(hv);
    this.Nachbest.Hv = hv;
    this.Nachbest.Bauleiter = dbOracle.GetBauleiter(hv);
    this.Nachbest.Projektleiter = dbOracle.GetProjektleiter(hv);
}

private void ExecuteComboboxSelectionChanged(object param)
{
    Empf = new ObservableCollection<string>()
    {
        "CompanyA",
        "CompanyB",
        "CompanyC"             
    };
Nachbest.Empf_Ansprechpartner = "CompanyB";
            Nachbest.Empfaenger_Mail = "orders@companyB.com";
            Nachbest.Empfaenger = SelValue; //if this is left out and there is no selection (just the default remaining unchanged!), Nachbest.Empfaenger will be null!
}
}
public neueNachbestellung(字符串someId)
{
初始化组件();
this.DataContext=新的neueNachbestellungViewModel(someId);
}
视图模型(neueNachbestellungViewModel.cs)

公共类neueNachbestellungViewModel:INotifyPropertyChanged
{
public ICommand LoadCombobox=>newdelegatecommand(ExecuteLoadCombobox);
公共ICommand ComboxSelectionChanged=>new DelegateCommand(ExecuteComboxSelectionChanged);
公共Nachbestellung Nachbest{get;set;}
私有对象;
私人可观测收集_empf;
公共可观测收集Empf
{
获取{return\u empf;}
设置
{
_empf=值;
不动产变更(“Empf”);
}
}
私有字符串_selValue=“12”;
公共字符串值
{
获取{return\u selValue;}
设置
{
_selValue=值;
OnPropertyChanged(“SelValue”);
}
}
公共事件属性更改事件处理程序属性更改;
公共虚拟void OnPropertyChanged(字符串propertyName)
{
if(this.PropertyChanged!=null)
{
this.PropertyChanged(this,newpropertychangedventargs(propertyName));
}
}
公共neueNachbestellungViewModel(字符串id)
{
this.Artikel=新的ArtikelViewModel();

this.ArtikelList=new ObservableCollection

这是我的快速而肮脏的解决方案。它做了它需要做的事情,我没有这些点击按钮,选择改变了我代码中的事件,但是在我的视图模型中。这就是我现在所需要的。显然不是一个优雅的解决方案,但它正在工作。我希望我能帮助一些开发人员解决我的问题在这种情况下,视图模型中的ICommand属性不是必需的,但我正在使用它们来处理视图中的按钮单击事件。如果应用程序中不需要DelegateCommand类,您可以用自己的属性替换它们

XAML(neueNachbestellung.XAML):

<Window>
    <Grid>
        <StackPanel Grid.Column="0" Margin="25,25,0,0" x:Name="leftStPnl">
            <ComboBox x:Name="cboxEmpfaenger" 
                      ItemsSource="{Binding Empf}" 
                      Text="{Binding Empfaenger}" 
                      FontSize="12" Width="150" Margin="118,0,0,0"                      
                      SelectedItem="{Binding SelValue}">
            </ComboBox>
            <TextBox x:Name="txtEmpfAnsprechpartner" DataContext="{Binding Nachbest}" Text="{Binding Empf_Ansprechpartner}" FontSize="12" IsEnabled="False" Width="150" Margin="50,0,0,0"/>    
            <TextBox x:Name="txtEmpfMail" DataContext="{Binding Nachbest}" Text="{Binding Empfaenger_Mail}" FontSize="12" IsEnabled="False" Width="150" Margin="73,0,0,0"/>
        </StackPanel>
    </Grid>
</Window>
public neueNachbestellung(string someId) 
{
    InitializeComponent();
    this.DataContext = new neueNachbestellungViewModel(someId);
}
public class neueNachbestellungViewModel: INotifyPropertyChanged
{
//public ICommand LoadCombobox => new DelegateCommand<object>(ExecuteLoadCombobox);
public ICommand ComboboxSelectionChanged => new DelegateCommand<object>(ExecuteComboboxSelectionChanged);
public Nachbestellung Nachbest { get; set; }
private object someObject; //DelegateCommand.cs requires an argument
private ObservableCollection<string> _empf;
        public ObservableCollection<string> Empf
        {
            get { return _empf; }
            set
            {
                _empf = value;
                OnPropertyChanged("Empf");
            }
        }
        private string _selValue = "CompanyB"; //default value
        public string SelValue  
        {
            get { return _selValue; }
            set
            {
                _selValue = value;
                OnPropertyChanged("SelValue");
 switch (SelValue)
    {

        case "CompanyA":
            {
                Nachbest.Empf_Ansprechpartner = "CompanyA";
                Nachbest.Empfaenger_Mail = "service@companyA.com";
            }
            break;

        case "CompanyB":
            {
                Nachbest.Empf_Ansprechpartner = "CompanyB";
                Nachbest.Empfaenger_Mail = "orders@companyB.com";
            }
            break;

        case "CompanyC":
            {
                Nachbest.Empf_Ansprechpartner = "CompanyC";
                Nachbest.Empfaenger_Mail = "info@companyC.com";
            }
            break;

        default:
            MessageBox.Show("Something went wrong with the company selection!");
            break;
    }
//setting the Empfaenger property here with the current selected value is necessary for the database insert later on!
Nachbest.Empfaenger = SelValue;
            }
        }

 public event PropertyChangedEventHandler PropertyChanged;
        public virtual void OnPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

public neueNachbestellungViewModel(string id)
{

    this.Artikel = new ArtikelViewModel();
    this.ArtikelList = new ObservableCollection<Artikel>();
    InitializeReorderModel(id);    
    ExecuteComboboxSelectionChanged(someObject);                        
}

public void InitializeReorderModel(string id)
{
    //set the MODEL
    this.Nachbest = new Nachbestellung();

    //Retrieve and set some values on *VIEW LOAD*!
    var dbOracle = new Datenbank();
    this.Nachbest.Bv = dbOracle.GetBauvorhaben(hv);
    this.Nachbest.Hv = hv;
    this.Nachbest.Bauleiter = dbOracle.GetBauleiter(hv);
    this.Nachbest.Projektleiter = dbOracle.GetProjektleiter(hv);
}

private void ExecuteComboboxSelectionChanged(object param)
{
    Empf = new ObservableCollection<string>()
    {
        "CompanyA",
        "CompanyB",
        "CompanyC"             
    };
Nachbest.Empf_Ansprechpartner = "CompanyB";
            Nachbest.Empfaenger_Mail = "orders@companyB.com";
            Nachbest.Empfaenger = SelValue; //if this is left out and there is no selection (just the default remaining unchanged!), Nachbest.Empfaenger will be null!
}
}
neueNachbestellungViewModel.cs:

<Window>
    <Grid>
        <StackPanel Grid.Column="0" Margin="25,25,0,0" x:Name="leftStPnl">
            <ComboBox x:Name="cboxEmpfaenger" 
                      ItemsSource="{Binding Empf}" 
                      Text="{Binding Empfaenger}" 
                      FontSize="12" Width="150" Margin="118,0,0,0"                      
                      SelectedItem="{Binding SelValue}">
            </ComboBox>
            <TextBox x:Name="txtEmpfAnsprechpartner" DataContext="{Binding Nachbest}" Text="{Binding Empf_Ansprechpartner}" FontSize="12" IsEnabled="False" Width="150" Margin="50,0,0,0"/>    
            <TextBox x:Name="txtEmpfMail" DataContext="{Binding Nachbest}" Text="{Binding Empfaenger_Mail}" FontSize="12" IsEnabled="False" Width="150" Margin="73,0,0,0"/>
        </StackPanel>
    </Grid>
</Window>
public neueNachbestellung(string someId) 
{
    InitializeComponent();
    this.DataContext = new neueNachbestellungViewModel(someId);
}
public class neueNachbestellungViewModel: INotifyPropertyChanged
{
//public ICommand LoadCombobox => new DelegateCommand<object>(ExecuteLoadCombobox);
public ICommand ComboboxSelectionChanged => new DelegateCommand<object>(ExecuteComboboxSelectionChanged);
public Nachbestellung Nachbest { get; set; }
private object someObject; //DelegateCommand.cs requires an argument
private ObservableCollection<string> _empf;
        public ObservableCollection<string> Empf
        {
            get { return _empf; }
            set
            {
                _empf = value;
                OnPropertyChanged("Empf");
            }
        }
        private string _selValue = "CompanyB"; //default value
        public string SelValue  
        {
            get { return _selValue; }
            set
            {
                _selValue = value;
                OnPropertyChanged("SelValue");
 switch (SelValue)
    {

        case "CompanyA":
            {
                Nachbest.Empf_Ansprechpartner = "CompanyA";
                Nachbest.Empfaenger_Mail = "service@companyA.com";
            }
            break;

        case "CompanyB":
            {
                Nachbest.Empf_Ansprechpartner = "CompanyB";
                Nachbest.Empfaenger_Mail = "orders@companyB.com";
            }
            break;

        case "CompanyC":
            {
                Nachbest.Empf_Ansprechpartner = "CompanyC";
                Nachbest.Empfaenger_Mail = "info@companyC.com";
            }
            break;

        default:
            MessageBox.Show("Something went wrong with the company selection!");
            break;
    }
//setting the Empfaenger property here with the current selected value is necessary for the database insert later on!
Nachbest.Empfaenger = SelValue;
            }
        }

 public event PropertyChangedEventHandler PropertyChanged;
        public virtual void OnPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

public neueNachbestellungViewModel(string id)
{

    this.Artikel = new ArtikelViewModel();
    this.ArtikelList = new ObservableCollection<Artikel>();
    InitializeReorderModel(id);    
    ExecuteComboboxSelectionChanged(someObject);                        
}

public void InitializeReorderModel(string id)
{
    //set the MODEL
    this.Nachbest = new Nachbestellung();

    //Retrieve and set some values on *VIEW LOAD*!
    var dbOracle = new Datenbank();
    this.Nachbest.Bv = dbOracle.GetBauvorhaben(hv);
    this.Nachbest.Hv = hv;
    this.Nachbest.Bauleiter = dbOracle.GetBauleiter(hv);
    this.Nachbest.Projektleiter = dbOracle.GetProjektleiter(hv);
}

private void ExecuteComboboxSelectionChanged(object param)
{
    Empf = new ObservableCollection<string>()
    {
        "CompanyA",
        "CompanyB",
        "CompanyC"             
    };
Nachbest.Empf_Ansprechpartner = "CompanyB";
            Nachbest.Empfaenger_Mail = "orders@companyB.com";
            Nachbest.Empfaenger = SelValue; //if this is left out and there is no selection (just the default remaining unchanged!), Nachbest.Empfaenger will be null!
}
}
公共类neueNachbestellungViewModel:INotifyPropertyChanged
{
//public ICommand LoadCombobox=>newdelegatecommand(ExecuteLoadCombobox);
公共ICommand ComboxSelectionChanged=>new DelegateCommand(ExecuteComboxSelectionChanged);
公共Nachbestellung Nachbest{get;set;}
私有对象someObject;//DelegateCommand.cs需要一个参数
私人可观测收集_empf;
公共可观测收集Empf
{
获取{return\u empf;}
设置
{
_empf=值;
不动产变更(“Empf”);
}
}
私有字符串_selValue=“CompanyB”//默认值
公共字符串值
{
获取{return\u selValue;}
设置
{
_selValue=值;
OnPropertyChanged(“SelValue”);
开关(SelValue)
{
“CompanyA”案:
{
Nachbest.Empf_Ansprechpartner=“CompanyA”;
Nachbest.Empfaenger_邮件=”service@companyA.com";
}
打破
案例“公司B”:
{
Nachbest.Empf_Ansprechpartner=“CompanyB”;
Nachbest.Empfaenger_邮件=”orders@companyB.com";
}
打破
案例“CompanyC”:
{
Nachbest.Empf_Ansprechpartner=“CompanyC”;
Nachbest.Empfaenger_邮件=”info@companyC.com";
}
打破
违约:
Show(“公司选择出错了!”);
打破
}
//在此处使用当前选定值设置Empfainger属性对于以后的数据库插入是必需的!
Nachbest.Empfaenger=SelValue;
}
}
公共事件属性更改事件处理程序属性更改;
公共虚拟void OnPropertyChanged(字符串propertyName)
{
if(this.PropertyChanged!=null)
{
this.PropertyChanged(this,newpropertychangedventargs(propertyName));
}
}
公共neueNachbestellungViewModel(字符串id)
{
this.Artikel=新的ArtikelViewModel();
this.artikelist=新的可观察集合();
初始化OrderModel(id);
ExecuteComboxSelectionChanged(someObject);
}
public void initializerOrderModel(字符串id)
{
//树立榜样
this.Nachbest=新的Nachbestellung();
//在*查看加载*上检索并设置一些值!
var dbOracle=new Datenbank();
this.Nachbest.Bv=dbOracle.GetBauvorhaben(hv);
this.Nachbest.Hv=Hv;
th