public ObservableCollection<string> DoctorNameList { get => doctorNameList; set { doctorNameList = value; OnPropertyChanged(); } }这段代码的意义
时间: 2024-02-10 18:33:37 浏览: 44
这段代码定义了一个名为DoctorNameList的公共属性,类型为ObservableCollection<string>,用于存储医生的姓名列表。当这个属性的值被设置时,会触发OnPropertyChanged方法,通知界面进行更新。这是一种实现数据绑定的方式,可以保证界面与数据的同步更新。同时,使用ObservableCollection可以监听集合变化,当医生姓名列表发生变化时,界面也会自动更新。
相关问题
listbox绑定ObservableCollection<string>,以checkbox的形式展示,当选中checkbox时如何将CheckBox的值传入后台,给出代码
您好,以下是将选中的 CheckBox 的值传入后台的代码示例:
XAML 代码:
<ListBox ItemsSource="{Binding Items}">
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding}" IsChecked="{Binding IsChecked}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
C# 代码:
public class ItemViewModel : INotifyPropertyChanged
{
private string _text;
private bool _isChecked;
public string Text
{
get { return _text; }
set
{
_text = value;
OnPropertyChanged(nameof(Text));
}
}
public bool IsChecked
{
get { return _isChecked; }
set
{
_isChecked = value;
OnPropertyChanged(nameof(IsChecked));
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
public class ViewModel
{
public ObservableCollection<ItemViewModel> Items { get; set; }
public ViewModel()
{
Items = new ObservableCollection<ItemViewModel>
{
new ItemViewModel { Text = "Item 1" },
new ItemViewModel { Text = "Item 2" },
new ItemViewModel { Text = "Item 3" }
};
}
public void Save()
{
var selectedItems = Items.Where(x => x.IsChecked).Select(x => x.Text);
// 将选中的项传入后台进行处理
}
}
在 ViewModel 中,我们可以通过 Items 属性获取 ListBox 中的所有项,并通过 LINQ 查询选中的项。在 Save 方法中,我们可以将选中的项传入后台进行处理。
在WPF的MVVM设计中有仅有一个控件ComboBox,其IsEditable属性设置为true,该控件绑定后台ViewModel中的数据类型是public ObservableCollection<string> Source,Source的来源是sqlite数据库中的MSJ.db数据库的表Source的数据,该表只有一列数据,列名为Source,表里有两行数据分别为“上级配发”和“本级自购”,要求实现第一点:ComboBoxItem选择发生改变时,弹窗提示用户选择前后的数据;第二点:ComboBox的输入框在接受自定义输入后,判断用户输入不属于ComboBoxItem后,自动将其加入ComboBoxItem中,同时更新后台sqlite数据库的MSJ.db数据库的表Source的数据。请给出实现上述功能的完整实例代码
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实现,请自行搜索相关资料获取代码。