C# 设置组合框ViewModel选定索引默认值

C# 设置组合框ViewModel选定索引默认值,c#,wpf,xaml,mvvm,combobox,C#,Wpf,Xaml,Mvvm,Combobox,我正在尝试将组合框绑定到ViewModel,并将其默认值SelectedIndex设置为0或第一项 当我在ViewModel中设置默认的SelectedIndex时,它不起作用 尽管它可以与SelectedItem一起使用 XAML 项目来源 public List<string> _Example_Items = new List<string>() { "item 1", "item 2", "item 3" }; public List&l

我正在尝试将组合框绑定到ViewModel,并将其默认值
SelectedIndex
设置为
0
或第一项

当我在ViewModel中设置默认的
SelectedIndex
时,它不起作用

尽管它可以与
SelectedItem
一起使用


XAML 项目来源

public List<string> _Example_Items = new List<string>()
{
    "item 1",
    "item 2",
    "item 3"
};
public List<string> Example_Items
{
    get { return _Example_Items; }
    set
    {
        _Example_Items = value;
        OnPropertyChanged("Example_Items");
    }
}
所选项目

工作


您可以在数据加载完成时设置Example\u SelectedIndex,即Example\u项

   private _Example_Items;
   public List<string> Example_Items
    {
        get 
        { 
            if(_Example_Items == null)
            {
                loadExampleItems();
            }

            return _Example_Items; 
        }
        set
        {
            _Example_Items = value;
            OnPropertyChanged("Example_Items");
        }
    }
private\u示例\u项目;
公共列表示例\u项目
{
得到
{ 
if(_示例_项==null)
{
loadExampleItems();
}
返回示例项目;
}
设置
{
_示例_项=值;
OnPropertyChanged(“示例_项”);
}
}
//在这种情况下,如果您从服务器获取数据,这将是异步响应方法

private void loadExampleItems()
{
     var examples = new List<string>()
                    {
                        "item 1",
                        "item 2",
                        "item 3"
                    };

     Example_Items = examples;
     Example_SelectedIndex = Example_Items.FirstOrDefault();
}
private void loadExampleItems()
{
var examples=新列表()
{
“项目1”,
“项目2”,
“项目3”
};
示例项目=示例;
示例_SelectedIndex=示例_Items.FirstOrDefault();
}

不要同时绑定
SelectedItem
SelectedIndex
。是这样或那样的。这对我来说很好:

public class ViewModel
{
    public ViewModel()
    {
        Example_SelectedIndex = 0; //unnecessary since the default value of an int is 0
    }

    private List<string> _Example_Items = new List<string>()
    {
        "item 1",
        "item 2",
        "item 3"
    };
    public List<string> Example_Items
    {
        get { return _Example_Items; }
        set { _Example_Items = value; }
    }

    private int _Example_SelectedIndex;
    public int Example_SelectedIndex
    {
        get { return _Example_SelectedIndex; }
        set
        {
            if (_Example_SelectedIndex == value)
                return;

            _Example_SelectedIndex = value;
        }
    }
}
公共类视图模型
{
公共视图模型()
{
示例_SelectedIndex=0;//不需要,因为int的默认值为0
}
私有列表\u示例\u项目=新列表()
{
“项目1”,
“项目2”,
“项目3”
};
公共列表示例\u项目
{
获取{return\u示例\u Items;}
设置{u示例\u Items=value;}
}
私有整数\u示例\u选择的索引;
公共整数示例\u选择的索引
{
获取{return\u示例\u SelectedIndex;}
设置
{
如果(\u示例\u SelectedIndex==值)
返回;
_示例_SelectedIndex=值;
}
}
}
XAML:

<ComboBox x:Name="cboExample"
          ItemsSource="{Binding Example_Items}"
          SelectedIndex="{Binding Example_SelectedIndex}"
          HorizontalAlignment="Left" 
          Margin="0,0,0,0" 
          VerticalAlignment="Top" 
          Width="105" 
          Height="22"/>


顺便说一下,
\u示例\u SelectedIndex
应该是私有字段,而不是公共属性<代码>\u示例\u项目也应该是私有的。

是否在XAML中同时设置了属性(SelectedIndex和SelectedItem)?@Babbillumpa不只是一个,我只是举个例子。是否在输出窗口中检查了绑定错误?@Babbillumpa我没有看到与此组合框相关的任何错误。您只能绑定到属性。第一个视图模型有字段。它不能将项
string
转换为索引
int
,所以我使用了
Example\u SelectedItem=Example\u Items.FirstOrDefault()并且它可以工作。但是为什么它不能像在我的代码中那样使用
示例\u SelectedIndex=0
?SelectedIndex将根据集合中的seletedItem进行更改。如果您设置SelectedItem,它也会更新SelectedIndex,您应该使用SelectedIndex作为单向绑定,以了解什么是索引。@MattMcManis:您尝试过这个吗?
   private _Example_Items;
   public List<string> Example_Items
    {
        get 
        { 
            if(_Example_Items == null)
            {
                loadExampleItems();
            }

            return _Example_Items; 
        }
        set
        {
            _Example_Items = value;
            OnPropertyChanged("Example_Items");
        }
    }
private void loadExampleItems()
{
     var examples = new List<string>()
                    {
                        "item 1",
                        "item 2",
                        "item 3"
                    };

     Example_Items = examples;
     Example_SelectedIndex = Example_Items.FirstOrDefault();
}
public class ViewModel
{
    public ViewModel()
    {
        Example_SelectedIndex = 0; //unnecessary since the default value of an int is 0
    }

    private List<string> _Example_Items = new List<string>()
    {
        "item 1",
        "item 2",
        "item 3"
    };
    public List<string> Example_Items
    {
        get { return _Example_Items; }
        set { _Example_Items = value; }
    }

    private int _Example_SelectedIndex;
    public int Example_SelectedIndex
    {
        get { return _Example_SelectedIndex; }
        set
        {
            if (_Example_SelectedIndex == value)
                return;

            _Example_SelectedIndex = value;
        }
    }
}
<ComboBox x:Name="cboExample"
          ItemsSource="{Binding Example_Items}"
          SelectedIndex="{Binding Example_SelectedIndex}"
          HorizontalAlignment="Left" 
          Margin="0,0,0,0" 
          VerticalAlignment="Top" 
          Width="105" 
          Height="22"/>