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项) { 水果。添加(项目。水果名称); } 还果; } }

我对C#使用WPF有意见

这里只是简单介绍一下。
下面的代码通过实体框架将名称收集到列表中。
这在我的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事件
这种方法也很有价值,但是添加一个已经在任何DependencyObject派生类中公开的东西看起来毫无用处。INotifyPropertyChanged非常适合POCO类(普通的旧CLR对象)

  • 为组合框指定名称,然后显式设置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;
    }
  }
}