在WPF的MVVM设计中有仅有一个控件ComboBox,其IsEditable属性设置为true,该控件绑定后台ViewModel中的数据类型是public ObservableCollection<string> Source,Source的来源是sqlite数据库中的MSJ.db数据库的表Source的数据,该表只有一列数据,列名为Source,表里有两行数据分别为“上级配发”和“本级自购”,要求实现第一点:ComboBoxItem选择发生改变时,弹窗提示用户选择前后的数据;第二点:ComboBox的输入框在接受自定义输入后,判断用户输入不属于ComboBoxItem后,自动将其加入ComboBoxItem中,同时更新后台sqlite数据库的MSJ.db数据库的表Source的数据。请给出实现上述功能的完整实例代码

时间: 2024-02-06 11:09:43 浏览: 22
ViewModel代码如下: ```csharp public class MainViewModel : INotifyPropertyChanged { private ObservableCollection<string> _source; private string _selectedSource; public ObservableCollection<string> Source { get { return _source; } set { if (_source != value) { _source = value; OnPropertyChanged("Source"); } } } public string SelectedSource { get { return _selectedSource; } set { if (_selectedSource != value) { if (!string.IsNullOrEmpty(_selectedSource)) { MessageBox.Show($"您选择了{_selectedSource},下一步选择{_selectedSource}"); } _selectedSource = value; OnPropertyChanged("SelectedSource"); } } } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } ``` XAML代码如下: ```xml <Window x:Class="ComboBoxDemo.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid> <ComboBox x:Name="comboBox" IsEditable="True" Text="{Binding SelectedSource, Mode=TwoWay}"> <ComboBox.ItemsSource> <Binding Path="Source"/> </ComboBox.ItemsSource> <ComboBox.Style> <Style TargetType="ComboBox"> <Setter Property="IsDropDownOpen" Value="True" /> <Style.Triggers> <Trigger Property="Text" Value="{x:Null}"> <Setter Property="IsDropDownOpen" Value="False" /> </Trigger> </Style.Triggers> </Style> </ComboBox.Style> <ComboBox.InputBindings> <KeyBinding Key="Enter" Command="{Binding AddSourceCommand}"/> </ComboBox.InputBindings> </ComboBox> </Grid> </Window> ``` MainWindow.xaml.cs代码如下: ```csharp public partial class MainWindow : Window { private MainViewModel _viewModel; public MainWindow() { InitializeComponent(); _viewModel = new MainViewModel(); DataContext = _viewModel; LoadData(); } private void LoadData() { string connectionString = "Data Source=MSJ.db;Version=3;"; using (SQLiteConnection connection = new SQLiteConnection(connectionString)) { connection.Open(); string sql = "SELECT * FROM Source;"; SQLiteCommand command = new SQLiteCommand(sql, connection); SQLiteDataReader reader = command.ExecuteReader(); ObservableCollection<string> source = new ObservableCollection<string>(); while (reader.Read()) { source.Add(reader[0].ToString()); } _viewModel.Source = source; reader.Close(); connection.Close(); } } } ``` 在MainWindow.cs中用SQLiteConnection从数据库中读取数据,并将数据绑定到ComboBox上,同时添加了一个按Enter键的InputBinding,用于触发添加自定义输入的Command。AddSourceCommand在ViewModel中实现,代码如下: ```csharp public class MainViewModel : INotifyPropertyChanged { // ... public ICommand AddSourceCommand { get; set; } public MainViewModel() { AddSourceCommand = new RelayCommand(AddSource); } private void AddSource() { if (!string.IsNullOrEmpty(SelectedSource) && !Source.Contains(SelectedSource)) { Source.Add(SelectedSource); SaveData(); } } private void SaveData() { string connectionString = "Data Source=MSJ.db;Version=3;"; using (SQLiteConnection connection = new SQLiteConnection(connectionString)) { connection.Open(); string sql = "DELETE FROM Source;"; SQLiteCommand command = new SQLiteCommand(sql, connection); command.ExecuteNonQuery(); foreach (string source in Source) { sql = $"INSERT INTO Source(Source) VALUES('{source}');"; command = new SQLiteCommand(sql, connection); command.ExecuteNonQuery(); } connection.Close(); } } } ``` AddSourceCommand的实现简单地判断用户输入是否为空,是否已经存在于ComboBox中,如果不是则添加到Source中,并保存到数据库中。SaveData方法用SQLiteCommand执行SQL语句,删除原有数据并插入新数据。 其中,RelayCommand是一个常用的ICommand实现,请自行搜索相关资料获取代码。

相关推荐

最新推荐

recommend-type

在WPF中动态加载XAML中的控件实例代码

主要介绍了在WPF中动态加载XAML中的控件,实例分析了WPF中针对XAML中控件的动态调用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
recommend-type

C#中WPF ListView绑定数据的实例详解

主要介绍了C#中WPF ListView绑定数据的实例详解的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下
recommend-type

WPF如何自定义TabControl控件样式示例详解

主要给大家介绍了关于WPF如何自定义TabControl控件样式的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
recommend-type

WPF的ListView控件自定义布局用法实例

主要介绍了WPF的ListView控件自定义布局的方法,结合实例形式分析了WPF中ListView控件的布局方法,需要的朋友可以参考下
recommend-type

MVVM模式解析和在WPF中的实现

MVVM是Model、View、ViewModel的简写,这种模式的引入就是使用ViewModel来降低View和Model的耦合,说是降低...同一个ViewModel可以使用完全不用的View进行展示,同一个View也可以使用不同的ViewModel以提供不同的操作。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

解释minorization-maximization (MM) algorithm,并给出matlab代码编写的例子

Minorization-maximization (MM) algorithm是一种常用的优化算法,用于求解非凸问题或含有约束的优化问题。该算法的基本思想是通过构造一个凸下界函数来逼近原问题,然后通过求解凸下界函数的最优解来逼近原问题的最优解。具体步骤如下: 1. 初始化参数 $\theta_0$,设 $k=0$; 2. 构造一个凸下界函数 $Q(\theta|\theta_k)$,使其满足 $Q(\theta_k|\theta_k)=f(\theta_k)$; 3. 求解 $Q(\theta|\theta_k)$ 的最优值 $\theta_{k+1}=\arg\min_\theta Q(
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。