通过WPF中的ViewModel将值绑定到组合框

时间:2017-05-18 18:11:58

标签: c# wpf xaml mvvm combobox

我是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;
        }

    }

} 

1 个答案:

答案 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" 
    />