c# - 通过 WPF 中的 ViewModel 将值绑定(bind)到组合框

标签 c# wpf xaml mvvm combobox

我是 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/

相关文章:

c# - 当 DataTemplate 子项折叠时如何隐藏 ListView 项目占位符?

WPF "tooltip"弹出窗口闪烁

c# - 如何从代码隐藏更改 VisualBrush 中使用的 StaticResource 以响应正确的用户输入?

c# - WPF:如何让 Radiobuttons 显示为 ToggleButtons 的水平行

来自Assets文件夹的图像在UWP应用中不起作用

c# - 为什么 Shellexecute=false 会破坏这个?

javascript - 将下拉列表值从 View 传递到 Controller

c# - C#中的循环队列

c# - 如何存储 WPF 应用程序的登录信息

wpf - 在 DataTemplate 中使用自定义控件时绑定(bind)不起作用