C# 设置组合框ViewModel选定索引默认值
我正在尝试将组合框绑定到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
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"/>