C# 如何在ModelView中设置ComboBox选定项?

C# 如何在ModelView中设置ComboBox选定项?,c#,wpf,combobox,mvvm-light,C#,Wpf,Combobox,Mvvm Light,我有静态组合框项目。我的XAML如下所示: <ComboBox x:Name="comboBox" SelectedItem="{Binding MySelectedItem}" HorizontalAlignment="Left" Margin="58,7,0,0" VerticalAlignment="Top" Width="120"> <ComboBoxItem Name="cbi1">Item 1</ComboBoxItem>

我有静态组合框项目。我的XAML如下所示:

    <ComboBox x:Name="comboBox" SelectedItem="{Binding MySelectedItem}" HorizontalAlignment="Left" Margin="58,7,0,0" VerticalAlignment="Top" Width="120">
        <ComboBoxItem Name="cbi1">Item 1</ComboBoxItem>
        <ComboBoxItem Name="cbi2">Item 2</ComboBoxItem>
        <ComboBoxItem Name="cbi3">Item 3</ComboBoxItem>
    </ComboBox>

如何设置组合框的选定项具有
名称
?在从持久性存储器读取数据后,我想在MV构造函数中设置所选项。

您需要将SelectedValuePath=“Name”添加到组合框中。然后在ViewModel构造函数中,像这样添加启动项。我将SelectedDropDown属性设置为字符串,不确定是否必须将其作为您的案例中的ComboBoxItem

 public MainFormViewModel()
    {
        SelectedDropDown = "cbi1";
    }
 private string _SelectedDropDown;
    public string SelectedDropDown
    {
        get { return _SelectedDropDown; }
        set { _SelectedDropDown = value; NotifyPropertyChanged("SelectedDropDown"); }
    }
这是ComboBox代码,经过测试,效果良好

   <ComboBox x:Name="comboBox1" HorizontalAlignment="Left" Margin="114,213,0,0" SelectedValuePath="Name"  SelectedValue="{Binding SelectedDropDown }"  VerticalAlignment="Top" Width="120" Grid.Column="1">
            <ComboBoxItem Name="cbi1">Item 1</ComboBoxItem>
            <ComboBoxItem Name="cbi2">Item 2</ComboBoxItem>
            <ComboBoxItem Name="cbi3">Item 3</ComboBoxItem>
        </ComboBox>

项目1
项目2
项目3

您需要将SelectedValuePath=“Name”添加到组合框中。然后在ViewModel构造函数中,像这样添加启动项。我将SelectedDropDown属性设置为字符串,不确定是否必须将其作为您的案例中的ComboBoxItem

 public MainFormViewModel()
    {
        SelectedDropDown = "cbi1";
    }
 private string _SelectedDropDown;
    public string SelectedDropDown
    {
        get { return _SelectedDropDown; }
        set { _SelectedDropDown = value; NotifyPropertyChanged("SelectedDropDown"); }
    }
这是ComboBox代码,经过测试,效果良好

   <ComboBox x:Name="comboBox1" HorizontalAlignment="Left" Margin="114,213,0,0" SelectedValuePath="Name"  SelectedValue="{Binding SelectedDropDown }"  VerticalAlignment="Top" Width="120" Grid.Column="1">
            <ComboBoxItem Name="cbi1">Item 1</ComboBoxItem>
            <ComboBoxItem Name="cbi2">Item 2</ComboBoxItem>
            <ComboBoxItem Name="cbi3">Item 3</ComboBoxItem>
        </ComboBox>

项目1
项目2
项目3

必须从ViewModel创建集合才能使用SelectedItem

*.xaml(视图)


*.cs(视图模型)

public类主视图模型:INotifyPropertyChanged
{
公共主视图模型()
{
对于(int i=0;i<10;i++)
{
MyCollection.添加(“项目”+i);
}
MySelectedItem=“第2项”;
}
私有ObservableCollection myCollection=新ObservableCollection();
公共可观测集合MyCollection
{
得到
{
回采;
}
设置
{
myCollection=value;
NotifyPropertyChanged(“MyCollection”);
}
}
私有字符串_mySelectedItem;
公共字符串MySelectedItem
{
得到
{
返回_mySelectedItem;
}
设置
{
_mySelectedItem=值;
NotifyPropertyChanged(“MySelectedItem”);
}
}
//NotifyPropertyChanged
公共事件属性更改事件处理程序属性更改;
受保护的void NotifyPropertyChanged(字符串信息)
{
if(PropertyChanged!=null)
{
PropertyChanged(此,新PropertyChangedEventArgs(信息));
}
}
}

必须从ViewModel创建集合才能使用SelectedItem

*.xaml(视图)


*.cs(视图模型)

public类主视图模型:INotifyPropertyChanged
{
公共主视图模型()
{
对于(int i=0;i<10;i++)
{
MyCollection.添加(“项目”+i);
}
MySelectedItem=“第2项”;
}
私有ObservableCollection myCollection=新ObservableCollection();
公共可观测集合MyCollection
{
得到
{
回采;
}
设置
{
myCollection=value;
NotifyPropertyChanged(“MyCollection”);
}
}
私有字符串_mySelectedItem;
公共字符串MySelectedItem
{
得到
{
返回_mySelectedItem;
}
设置
{
_mySelectedItem=值;
NotifyPropertyChanged(“MySelectedItem”);
}
}
//NotifyPropertyChanged
公共事件属性更改事件处理程序属性更改;
受保护的void NotifyPropertyChanged(字符串信息)
{
if(PropertyChanged!=null)
{
PropertyChanged(此,新PropertyChangedEventArgs(信息));
}
}
}

你不能那样做。ComboBoxItem是一种引用类型,在您的ViewModel中,您将无法获取ComboxItem的引用。因此,您可以使用SelectedIndex而不是SelectedItemSelectedIndex,但这不是最佳解决方案。要使SelectedItem正常工作,我必须从ViewModel中创建并填充组合框项,这是我的理解吗?如果您知道如何回答,我们将不胜感激。您必须在ViewModel上创建它。我会回答你不能那样做。ComboBoxItem是一种引用类型,在您的ViewModel中,您将无法获取ComboxItem的引用。因此,您可以使用SelectedIndex而不是SelectedItemSelectedIndex,但这不是最佳解决方案。要使SelectedItem正常工作,我必须从ViewModel中创建并填充组合框项,这是我的理解吗?如果您知道如何回答,我们将不胜感激。您必须在ViewModel上创建它。我将给出答案
public class MainViewModel : INotifyPropertyChanged
{
    public MainViewModel()
    {
        for (int i = 0; i < 10; i++)
        {
            MyCollection.Add("Item " + i);
        }
        MySelectedItem = "Item 2";
    }


    private ObservableCollection<string> myCollection = new ObservableCollection<string>();

    public ObservableCollection<string> MyCollection
    {
        get
        {
            return myCollection;
        }
        set
        {
            myCollection = value;
            NotifyPropertyChanged("MyCollection");
        }
    }


    private string _mySelectedItem;
    public string MySelectedItem
    {
        get
        {
            return _mySelectedItem;
        }
        set
        {
            _mySelectedItem = value;
            NotifyPropertyChanged("MySelectedItem");
        }
    }

    //NotifyPropertyChanged
    public event PropertyChangedEventHandler PropertyChanged;
    protected void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }
}