我是WPF的新手,我只是尝试使用viewmodel类将值列表绑定到Combox,因为我试图在这里遵循MVVM模式。
这是正常的,但它没有将第一项作为默认项目绑定到组合框下拉列表,但我设置了SelectedIndex="0"
这是我如何做到的
这是组合框XML
<ComboBox VerticalAlignment="Top"
Loaded="ComboBox_Loaded" ItemsSource="{Binding Samples}" SelectedItem="{Binding Path=SAMPLE_NAME}"
SelectionChanged="ComboBox_SelectionChanged" DisplayMemberPath="SAMPLE_NAME" SelectedIndex="0" SelectedValuePath="SAMPLE_ID" />
这是 SampleModel 模型类
public class SampleModel
{
public int SAMPLE_ID { get; set; }
public string SAMPLE_NAME { get; set; }
}
这是ViewModel类
public class SampleViewModel : ObservableObject
{
public SampleViewModel()
{
}
private ObservableCollection<SampleModel> _samples;
public ObservableCollection<SampleModel> Samples
{
get
{
return _samples;
}
set
{
_samples = value;
NotifyPropertyChanged("Samples");
}
}
public void FillSamplesDropdown(string Id)
{
using (var _context = new SampleBL())
{
List<SampleModel> _samples = _context.GetAllSamples(Id);
Samples = new ObservableCollection<SampleModel>(_samples);
}
}
}
这是存在组合框
的代码隐藏文件public partial class SamplePopup : Window
{
public SamplePopup()
{
InitializeComponent();
this.DataContext = new SampleViewModel();
}
private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
try
{
SampleViewModel ddl = (SampleViewModel)this.DataContext;
ddl.FillSamplesDropdown(null);
}
catch (Exception ex)
{
throw ex;
}
}
private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
try
{
SampleViewModel ddl= (SampleViewModel)this.DataContext;
// ... Get the ComboBox.
var comboBox = sender as ComboBox;
...
}
catch (Exception ex)
{
throw ex;
}
}
}
答案 0 :(得分:0)
不要为SelectedIndex
而烦恼,并摆脱ComboBox_Loaded
中的代码。将FillSamplesDropdown()
重命名为FillSampleList()
或不引用用户界面的内容。视图模型不应该知道&#34; UI存在。然后在viewmodel构造函数中调用FillSampleList()
(或任何你称之为的)。
为您的viewmodel提供一个选定的示例属性:
public class SampleViewModel : ObservableObject
{
public SampleViewModel()
{
}
private SampleModel _selectedSample;
public SampleModel SelectedSample
{
get
{
return _selectedSample;
}
set
{
_selectedSample= value;
NotifyPropertyChanged("SelectedSample");
}
}
初始化Samples
时,请将SelectedSample
设置为第一项:
public void FillSamplesList(Object o)
{
Samples = new ObservableCollection<Sample>();
// ...populate...
SelectedSample = Samples.FirstOrDefault();
}
然后您的视图会绑定SelectedSample
。这说明了SelectedItem
的用途;你用它做了什么不会做任何事情,因为你的viewmodel没有SAMPLE_NAME
属性。
顺便说一句,如果您未将SelectedSampleID
属性绑定到SelectedValue
,请不要设置SelectedValuePath
。
<ComboBox
VerticalAlignment="Top"
ItemsSource="{Binding Samples}"
SelectedItem="{Binding SelectedSample}"
DisplayMemberPath="SAMPLE_NAME"
/>