似乎无法在我的脑海中获得 WPF DataBinding

Posted

技术标签:

【中文标题】似乎无法在我的脑海中获得 WPF DataBinding【英文标题】:Can't seem to get WPF DataBinding in my head 【发布时间】:2011-07-19 22:58:20 【问题描述】:

好的,我不是编程或 C# 方面的新手,我似乎无法直接在脑海中了解 WPF 的数据绑定。我的同事对此赞不绝口(是的,我也会问他们),但现在我很难过。

这是我想为初学者做的事情:

例如,我有一个 事物 列表,如下所示:

List<Thing> thingList = Source.getList();

现在我通常会去

foreach(Thing t in thingList)

    //add thing to combobox

但据我所知,我可以以某种方式不这样做,而是使用数据绑定来为我填充组合框。

我似乎无法得到的是在哪里我应该把“thingList”放在哪里?我是否在某处将其作为单独的财产?我应该把那个属性放在哪里?

此刻我觉得自己很愚蠢,因为我已经为此苦苦挣扎了一段时间,但我找不到任何可以让我理解这个 - 可能非常简单 - 概念的例子。

有没有人愿意帮助我或指出一些我可能错过的分步指南?

【问题讨论】:

如果它类似于 Winforms 数据绑定,你的组合框应该有一个 DataSource 属性(或类似的东西),你应该能够设置 comboBox.DataSource = Source.getList(); 只要你设置了DisplayMemberValueMembers 将显示正确的内容,并且 SelectedValue 将检索对象本身。 这里有几个 SO 问题可以帮助您朝着正确的方向开始:Binding WPF ComboBox to a Custom List 和 MVVM: Tutorial from start to finish 在 WPF 中,诸如 ComboBoxes 和 ListViews 之类的东西被用作数据的可视容器。在代码后面或从文件等中构建和编辑您的列表,并绑定到表单上的控件。 【参考方案1】:

在 WPF 中使用 ObservableCollection&lt;T&gt; 进行数据绑定。 T 是你的班级。请参阅下面的示例

public class NameList : ObservableCollection<PersonName>

    public NameList() : base()
    
        Add(new PersonName("A", "E"));
        Add(new PersonName("B", "F"));
        Add(new PersonName("C", "G"));
        Add(new PersonName("D", "H"));
    
  

  public class PersonName
  
      private string firstName;
      private string lastName;

      public PersonName(string first, string last)
      
          this.firstName = first;
          this.lastName = last;
      

      public string FirstName
      
          get  return firstName; 
          set  firstName = value; 
      

      public string LastName
      
          get  return lastName; 
          set  lastName = value; 
      
  

现在在 XAML 中。转到资源标签

<Window
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

  xmlns:c="clr-namespace:SDKSample"

  x:Class="Sample.Window1"
  Width="400"
  Height="280"
  Title="MultiBinding Sample">

  <Window.Resources>
    <c:NameList x:Key="NameListData"/>
  </Window.Resources>


<ListBox Width="200"
         ItemsSource="Binding Source=StaticResource NameListData"  // Name list data is declared in resource
         ItemTemplate="StaticResource NameItemTemplate"
         IsSynchronizedWithCurrentItem="True"/>

xmnls:c 会给你选择课程的选项。在这里你可以选择 c,d ,e x 任何东西,但要确保它应该更早使用

【讨论】:

您只需要在集合预计会发生变化时使用ObservableCollection。如果集合是静态的,那么任何实现 IEnumerable 的东西都可以。 是的,我知道,当您需要双向绑定时会使用它,否则只需数据源和数据值成员等即可 这主要是我想要的,是的。我知道这是一个非常广泛的主题,但是您所描述的主要是我正在考虑的“自动”过程。谢谢。【参考方案2】:

谈到数据绑定,我发现this page 如果仔细阅读,可以回答初学者的大部分问题。

要回答这个问题:添加所有项目的替代方法是告诉 ComboBox 从哪里获取项目,这是通过 ItemsSource 属性完成的。

您可以在 XAML 或代码中设置它,但您需要在 XAML 中使用绑定表达式,而正常的赋值应该在代码中执行:

comboBox.ItemsSource = thingList;

如果您没有进一步指定列表中这些对象的显示方式,则将调用ToString 方法,除非被覆盖,否则您通常会得到对象的类路径。告诉应用程序如何显示对象主要有两种方式:

第一个也是更重的选项是Data Templates,它用于使用控件显示复杂的数据(反过来可以有项目和模板等),第二种方法是使用像DisplayMemberPath这样的轻量级属性,应该设置到应该显示的属性的名称(通常只是一个字符串)。

如果您的列表发生更改并且组合框应自行更新,则源应实现INotifyCollectionChanged,在大多数情况下,您将使用标准实现ObersableCollection&lt;T&gt;

【讨论】:

【参考方案3】:

大多数人会使用 WPF 数据绑定来填充组合框,但您不必这样做。

您可以根据需要通过代码添加项目。

很容易陷入“应该”做的所有事情,而没有充分的理由这样做(顺便说一句,我不建议您手动添加项目,我只是说您可以) .

List<Thing> thingList = Source.getList();

foreach(Thing t in thingList)

   combobox.Items.Add( t );

【讨论】:

这可能是实现这一目标的最糟糕的方式,并且有很多充分的理由不这样做。至少您应该更新您的示例以将集合分配给 ItemsSource 而不是单独添加每个项目。 我想我已经明确表示我不推荐这种填充列表的方式。我只是在回应“但据我所知,我无法做到这一点”。

以上是关于似乎无法在我的脑海中获得 WPF DataBinding的主要内容,如果未能解决你的问题,请参考以下文章

无法在我的列表框中看到项目的名称,WPF,C#

使用 Laravel 5.8 无法在我的浏览器中获得基本的 select2 多选功能

无法使用 String.Format 在 WPF 中显示版本字符串

WPF数据绑定到图像文件永远锁定该文件[重复]

在我的 WPF 应用程序安装程序中包含 SQLCE (3.5)

如何在没有焦点的情况下突出显示/选择 wpf 文本框中的文本?