C#WPF中的数据绑定组合框
我对C#使用WPF有意见 这里只是简单介绍一下。C#WPF中的数据绑定组合框,c#,wpf,xaml,mvvm,data-binding,C#,Wpf,Xaml,Mvvm,Data Binding,我对C#使用WPF有意见 这里只是简单介绍一下。 下面的代码通过实体框架将名称收集到列表中。 这在我的MainWindow.xaml.cs文件中 公共可观测收集信息 { 得到 { 使用(var context=new Fruit()) { ObservableCollection水果=新的ObservableCollection(); foreach(context.Fruits.OrderBy(s=>s.FruitName)中的var项) { 水果。添加(项目。水果名称); } 还果; } }
下面的代码通过实体框架将名称收集到列表中。
这在我的MainWindow.xaml.cs文件中
公共可观测收集信息
{
得到
{
使用(var context=new Fruit())
{
ObservableCollection水果=新的ObservableCollection();
foreach(context.Fruits.OrderBy(s=>s.FruitName)中的var项)
{
水果。添加(项目。水果名称);
}
还果;
}
}
}
在我的MainWindow.xaml
文件中,我有以下内容:
<GroupBox Grid.Row="0" Grid.Column="0" Margin="5" Header="Fruit Info" >
<ComboBox Margin="5" SelectedItem="{Binding FruitInfo}"/>
</GroupBox>
在运行我的项目时,我看到组合框没有填充水果。知道我为什么没看到这个吗
您应该将组合框的ItemsSource绑定到您的集合,将SelectedItem绑定到表示用户选择的另一个字符串 第一:
<GroupBox Grid.Row="0" Grid.Column="0" Margin="5" Header="Fruit Info" >
<ComboBox Margin="5" ItemsSource="{Binding FruitInfo}" SelectedItem="{Binding SelectedFruit}"/>
</GroupBox>
我不使用实体框架,但我认为水果信息属性的模式缺少一个重要部分 问题是绑定机制没有意识到新的ObservaleCollection,因为它期望某种“通知”方式发出警报。也就是说,您有几种解决问题的方法:
- 使用DependencyProperty而不是普通属性:每次设置属性时,也会通知绑定控件
- 在公开FruitInfo属性的类(例如MainWindow)中实现INotifyPropertyChanged接口,然后在任何实际的FruitInfo值更改时触发PropertyChanged事件
- 为组合框指定名称,然后显式设置ItemsSource属性
- 使用的模式以“懒惰”的方式创建集合:考虑避免懒惰的方式,并在组合框被创建/绑定之前设置RealFrimo值。
private ObservableCollection<string> _fruits = new ObservableCollection<string>();
public ObservableCollection<string> FruitInfo
{
get
{
using (var context = new Fruit())
{
this._fruits.Clear();
foreach (var item in context.Fruits.OrderBy(s => s.FruitName))
{
this._fruits.Add(item.FruitName);
}
return this._fruits;
}
}
}
private observetecollection\u fruits=new observetecollection();
公共可观测收集信息
{
得到
{
使用(var context=new Fruit())
{
这个;
foreach(context.Fruits.OrderBy(s=>s.FruitName)中的var项)
{
添加(项目名称);
}
把这个还给我;
}
}
}
好的,我明白你想做什么,尽管我仍然不知道你为什么要这么做
使用using
的想法是,它为您创建变量,并在您完成正在运行的代码块时处理该变量
现在,您正在该块中创建一个变量,并返回它。。。然后,系统尝试处理它。因此,您的退货托收必须隐式转换为System.IDisposable,我怀疑您的是
撇开这一点不谈,你应该听从emedbo的建议。您将源绑定到集合,并为所选索引拥有另一个属性(因为您使用的是mvvm)
我不会在getter中使用在中获取这样的数据,因为感觉您获取的数据可能会被删除,如果不是,那么使用
的的整个用法就有点错误
更不用说它的可读性不强,在大多数情况下,您都应该以可读性为目标。-1您提出了许多不同的建议,其中大多数都是不好的做法。@HighCore:用户有一个问题,我列出了一些解决方法。我不认为有任何不好的做法,除非明确表示。然而,糟糕的做法并不意味着雷区。谢谢你的帮助@mariovernari,我甚至不知道你在这里想要实现什么。为什么要调用水果(),它返回什么,为什么要在get
中使用use
?你能详细说明一下吗?这里的目标是从我的数据库返回一个水果名的有序列表,并将它们显示在我的WPF的下拉列表中。我使用“using”来引用数据库,创建并返回可观察的集合。“get”只会得到列表。@GabrielY:你能尝试一下我回答中描述的修改吗?谢谢你在这个Mario上的帮助。这已经解决了,谢谢你的帮助。
private ObservableCollection<string> _fruits = new ObservableCollection<string>();
public ObservableCollection<string> FruitInfo
{
get
{
using (var context = new Fruit())
{
this._fruits.Clear();
foreach (var item in context.Fruits.OrderBy(s => s.FruitName))
{
this._fruits.Add(item.FruitName);
}
return this._fruits;
}
}
}