gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:43:11 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com