我使用WPF遇到了C#的问题。
在这里简短说明。
下面的代码通过Entity Framework将名称收集到一个列表中
这是在我的MainWindow.xaml.cs文件中。
public ObservableCollection<string> FruitInfo
{
get
{
using (var context = new Fruit())
{
ObservableCollection<string> fruits= new ObservableCollection<string>();
foreach (var item in context.Fruits.OrderBy(s => s.FruitName))
{
fruits.Add(item.FruitName);
}
return fruits;
}
}
}
在我的MainWindow.xaml
文件中,我有以下内容:
<GroupBox Grid.Row="0" Grid.Column="0" Margin="5" Header="Fruit Info" >
<ComboBox Margin="5" SelectedItem="{Binding FruitInfo}"/>
</GroupBox>
在运行我的项目时,我发现组合框没有填充结果 任何想法为什么我没有看到这个?
所有的想法都赞赏
答案 0 :(得分:2)
您应该将ComboBox的ItemsSource绑定到您的集合,并将SelectedItem绑定到另一个表示用户选择的字符串。
第一:
<GroupBox Grid.Row="0" Grid.Column="0" Margin="5" Header="Fruit Info" >
<ComboBox Margin="5" ItemsSource="{Binding FruitInfo}" SelectedItem="{Binding SelectedFruit}"/>
</GroupBox>
第二:在ViewModel中制作一个SelectedFruit
public string SelectedFruit { get; set; }
答案 1 :(得分:0)
好的,我明白你要做什么,即使我仍然不确定你为什么要这样做。
使用using
的想法是它为你创建变量,并在你完成正在运行的代码块时处理它。
现在,您正在该块中创建一个变量,并将其返回...然后,系统会尝试处理它。因此,您的返回集合必须可以隐式转换为System.IDisposable,我怀疑它是。
暂且不说,你应该遵循emedbo建议。您将源绑定到集合,并具有所选索引的另一个属性(因为您使用的是mvvm)。
我不会在getter中的using
内得到类似的数据,因为感觉你得到的数据可能会被删除,如果不是,那么整个使用你的{{ 1}}有点不对。
更不用说它不是很易读了,在大多数情况下你应该以可读性为目标。
答案 2 :(得分:-1)
我不使用实体框架,但我认为FruitInfo属性的模式缺少重要部分。
问题是绑定机制没有意识到新的ObservableCollection,因为它期望一些“通知”方式被警告。也就是说,您有几种方法可以解决您的问题:
我推荐这个解决方案:可靠且多功能。
这种方式也很有价值,但添加已在任何DependencyObject派生类中公开的东西看起来毫无用处。 INotifyPropertyChanged非常适合POCO类(Plain-Old CLR-Objects)。
它运行正常,但您将失去数据上下文继承的好处,尤其是在模板中。
可行,但通常可以在少数情况下应用。还要求您确定对象创建的顺序。保持最新的方式。
==更新
尝试按如下方式修改代码:
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;
}
}
}