我是 WPF 的新手,我只是尝试使用 viewmodel 类将值列表绑定(bind)到 Combox,因为我在这里尝试遵循 MVVM 模式。
这工作正常,除了它没有将第一项作为默认项绑定(bind)到组合框下拉列表,虽然我设置了 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" />
这是 sample 型号模型类
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;
}
}
}
最佳答案
不要打扰 SelectedIndex
, 并去掉 ComboBox_Loaded
中的代码.重命名 FillSamplesDropdown()
至FillSampleList()
或者没有引用用户界面的东西。 View 模型不应该“知道” UI 存在。然后调用FillSampleList()
在 viewmodel 构造函数中(或任何你称之为的)。
为您的 View 模型提供一个选定的示例属性:
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();
}
然后你的 View 绑定(bind)
SelectedSample
.这说明了 SelectedItem
是为了;你用它做的不会做任何事情,因为你的 View 模型没有 SAMPLE_NAME
属性(property)。如果您没有绑定(bind)
SelectedSampleID
属性(property)给 SelectedValue
,顺便说一下,不要设置SelectedValuePath
.<ComboBox
VerticalAlignment="Top"
ItemsSource="{Binding Samples}"
SelectedItem="{Binding SelectedSample}"
DisplayMemberPath="SAMPLE_NAME"
/>
关于c# - 通过 WPF 中的 ViewModel 将值绑定(bind)到组合框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44055073/