C#WPF中的数据绑定组合框

时间:2013-11-23 06:34:23

标签: c# wpf xaml mvvm data-binding

我使用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>

在运行我的项目时,我发现组合框没有填充结果 任何想法为什么我没有看到这个?

所有的想法都赞赏

3 个答案:

答案 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,因为它期望一些“通知”方式被警告。也就是说,您有几种方法可以解决您的问题:

  • 使用DependencyPropety而不是普通属性:每次设置属性时,都会通知绑定控件。

我推荐这个解决方案:可靠且多功能。

  • 在暴露FruitInfo属性(例如MainWindow)的类中实现INotifyPropertyChanged接口,然后在任何实际的FruitInfo值更改时触发PropertyChanged事件。

这种方式也很有价值,但添加已在任何DependencyObject派生类中公开的东西看起来毫无用处。 INotifyPropertyChanged非常适合POCO类(Plain-Old CLR-Objects)。

  • 为组合框命名,然后显式设置ItemsSource属性。

它运行正常,但您将失去数据上下文继承的好处,尤其是在模板中。

  • 您使用的模式以“懒惰”方式创建集合:考虑避免使用惰性方式,并在创建/绑定组合框之前设置FruitInfo值。

可行,但通常可以在少数情况下应用。还要求您确定对象创建的顺序。保持最新的方式。

==更新

尝试按如下方式修改代码:

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;
    }
  }
}