繁体   English   中英

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

[英]Data Binding Combo Box in C# WPF

我在使用WPF的C#遇到问题。

这里只是简短。
下面的以下代码通过实体框架将名称收集到列表中。
这是在我的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>

运行我的项目时,我看到“组合框”没有填充水果。
有什么主意我为什么看不到吗?

所有想法表示赞赏

您应该将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; }

好的,即使我仍然不确定您为什么要尝试这样做,我也知道您想做什么。

使用using的想法是它为您创建变量,并在您完成正在运行的代码块时将其处置。

现在,您正在该块中创建一个变量,然后将其返回...然后,系统尝试处理它。 因此,您的返回集合必须可以隐式转换为System.IDisposable,我怀疑您的是。

抛开这些,您应该遵循emedbo的建议。 您将源绑定到集合,并为所选索引具有另一个属性(因为您正在使用mvvm)。

我不会在getter内的using获取像这样的数据,因为感觉您正在获取的数据可能会被删除,如果没有,那么您using的整个使用都会有些错误。

更不用说它不是很可读,在大多数情况下,您应该着眼于可读性。

我不使用实体框架,但是我认为FruitInfo属性的模式缺少重要的一部分。

问题在于绑定机制无法实现新的ObservableCollection,因为它希望以某种“通知”方式来发出警报。 也就是说,您有几种解决问题的方法:

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

我建议这种解决方案:可靠且用途广泛。

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

这种方法也很有价值,但是添加任何已经从DependencyObject派生的类中公开的东西看起来毫无用处。 INotifyPropertyChanged非常适合POCO类(普通的CLR对象)。

  • 给组合框命名,然后显式设置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;
    }
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM