[英]Setting and Showing the SelectedItem in ComboBox from VM in WPF Prism MVVM
我正在尝试从我的VM设置一个ComboBox SelectedItem。 我想我已经接近了,但是当从VM进行设置时,我不知道如何在ComboBox中显示SelectedItem。
文本框具有对SelectedItem属性的绑定。 当我运行它时,它的确会在我的文本框中显示星期五,但是组合框仍然为空。 TextBox还显示了我可以在ComboBox中选择的任何值,所以我认为我已经做好了。 我还需要更改以在组合框中显示它吗? 不确定我在代码中犯了一个错误,或者说实话,我只需要做一些我不知道的事情。
示例数据库是WeekDays
WeekDayID WeekDayShort WeekDayLong
1 Sun Sunday
2 Mon Monday
3 Tue Tuesday
4 Wed Wednesday
5 Thu Thursday
6 Fri Friday
7 Sat Saturday
模特WeekDays.cs:
public partial class WeekDays
{
public int WeekDayID { get; set; }
public string WeekDayShort { get; set; }
public string WeekDayLong { get; set; }
}
ViewModel MainViewModel.cs:
class MainViewModel : BindableBase
{
private ObservableCollection<WeekDays> _weekDays;
public ObservableCollection<WeekDays> WeekDays
{
get
{
return _weekDays;
}
set
{
SetProperty(ref _weekDays, value);
}
}
private WeekDays _selectedWeekDay;
public WeekDays SelectedWeekDay
{
get
{
return _selectedWeekDay;
}
set
{
SetProperty(ref _selectedWeekDay, value);
}
}
private void FillWeekDays()
{
using (NLTrader01Entities nlt = new NLTrader01Entities())
{
var q = (from a in nlt.WeekDays select a).ToList();
WeekDays = new ObservableCollection<WeekDays>(q);
}
}
public MainViewModel()
{
FillWeekDays();
Initialize();
}
public void Initialize()
{
using (NLTrader01Entities nlt = new NLTrader01Entities())
{
SelectedWeekDay = (from a in nlt.WeekDays where a.WeekDayLong == "Friday" select a).Single();
}
}
}
还有View.xaml:
<ComboBox
ItemsSource="{Binding WeekDays}"
DisplayMemberPath="WeekDayLong"
SelectedItem="{Binding SelectedWeekDay, Mode=TwoWay}">
</ComboBox>
<TextBox
Text="{Binding SelectedWeekDay.WeekDayLong, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
</TextBox>
当您要通过ComboBox的item类的属性值选择一个项目时,应设置SelectedValue
和SelectedValuePath
属性,而不是SelectedItem:
<ComboBox ItemsSource="{Binding WeekDays}"
DisplayMemberPath="WeekDayLong"
SelectedValuePath="WeekDayLong"
SelectedValue="{Binding SelectedWeekDay}"/>
在视图模型中, SelectedWeekDay
属性不再是WeekDay实例,而只是一个字符串:
private string _selectedWeekDay;
public string SelectedWeekDay
{
get { return _selectedWeekDay; }
set { SetProperty(ref _selectedWeekDay, value); }
}
TextBox绑定如下所示:
<TextBox Text="{Binding SelectedWeekDay, UpdateSourceTrigger=PropertyChanged}"/>
当然,您可以像下面这样在代码中简单地设置它:
SelectedWeekDay = "Friday";
感谢Clemens在这里为我指引正确的方向,给出了两个对我有用的可能答案。
解决方案01:
继续使用SelectedItem并引入SelectedIndex。
ViewModel MainViewModel.cs:
class MainViewModel : BindableBase
{
private ObservableCollection<WeekDays> _weekDays;
public ObservableCollection<WeekDays> WeekDays
{
get
{
return _weekDays;
}
set
{
SetProperty(ref _weekDays, value);
}
}
private int _selectedIndex;
public int SelectedIndex
{
get
{
return _selectedIndex;
}
set
{
SetProperty(ref _selectedIndex, value);
}
}
private WeekDays _selectedWeekDay;
public WeekDays SelectedWeekDay
{
get
{
return _selectedWeekDay;
}
set
{
SetProperty(ref _selectedWeekDay, value);
}
}
private void FillWeekDays()
{
using (NLTrader01Entities nlt = new NLTrader01Entities())
{
var q = (from a in nlt.WeekDays select a).ToList();
WeekDays = new ObservableCollection<WeekDays>(q);
}
}
public MainViewModel()
{
FillWeekDays();
SelectedIndex = 4;
}
}
还有View.xaml:
<ComboBox
ItemsSource="{Binding WeekDays}"
DisplayMemberPath="WeekDayLong"
SelectedItem="{Binding SelectedWeekDay}"
SelectedIndex="{Binding SelectedIndex}">
</ComboBox>
<TextBox
Text="{Binding SelectedWeekDay.WeekDayLong}">
</TextBox>
解决方案02:
将SelectedIndex和SelectedValue与SelectedValuePath结合使用。
ViewModel MainViewModel.cs:
class MainViewModel : BindableBase
{
private ObservableCollection<WeekDays> _weekDays;
public ObservableCollection<WeekDays> WeekDays
{
get
{
return _weekDays;
}
set
{
SetProperty(ref _weekDays, value);
}
}
private int _selectedIndex;
public int SelectedIndex
{
get
{
return _selectedIndex;
}
set
{
SetProperty(ref _selectedIndex, value);
}
}
private WeekDays _selectedWeekDay;
public WeekDays SelectedWeekDay
{
get
{
return _selectedWeekDay;
}
set
{
SetProperty(ref _selectedWeekDay, value);
}
}
private void FillWeekDays()
{
using (NLTrader01Entities nlt = new NLTrader01Entities())
{
var q = (from a in nlt.WeekDays select a).ToList();
WeekDays = new ObservableCollection<WeekDays>(q);
}
}
public MainViewModel()
{
FillWeekDays();
SelectedIndex = 4;
}
}
还有View.xaml:
<ComboBox
ItemsSource="{Binding WeekDays}"
DisplayMemberPath="WeekDayLong"
SelectedValuePath="WeekDayLong"
SelectedValue="{Binding SelectedWeekDay}"
SelectedIndex="{Binding SelectedIndex}">
</ComboBox>
<TextBox
Text="{Binding SelectedWeekDay.WeekDayLong}">
</TextBox>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.