0
点赞
收藏
分享

微信扫一扫

使用DataContext作为Binding的源

IT影子 2022-04-29 阅读 34
c#wpf

单个CLR类型对象指定为Binding的Source,方法有两个—把对象赋值给binding.Source属性或者把对象的Name赋值给Binding.ElementName。DataContext属性被定义在FrameworkElement类里,这个类是WPF的基类,这意味着所有WPF控件都具备这个属性。

     WPF的UI布局是树形结构,这颗树的每个结点都是控件,由此,得出另外一个结论,在UI元素树的每个结点都有DataContext。 这点非常重要,因为当一个Binding只知道自己的Path而不知道自己的Source时,它会沿着UI元素树向树的根部找过去。

     在实际工作中DataContext的用法是非常灵活的。

  1. 当UI上的多个控件都使用Binding关注同一个对象时,不妨使用DataContext。
  2. 当作为Source的对象不能被直接访问的时候—比如B窗体内的控件想把A窗体内的控件当作自己的Binding源时,但A窗体内的控件是private访问级别,这个时候就可以把这个控件(或者控件的值)作为窗体A的DataContext(这个属性是public访问级别的)从而暴露数据。

形象地说,这个时候外层容器的DataContext就相当于一个数据的“制高点”,只要把放上去,别的元素就都可以看见。另外,DataContent本身也是一个依赖属性,我们可以使用Binding把它关联到一个数据源上。

  使用集合对象作为列表控件的ItemSource

    WPF中的列表式控件门派生自ItemsControl类,自然也就继承了ItemSource这个属性。ItemsSource属性可以接收一个Ienumerable接口派生类的实例作为自己的值。每个ItemControl的派生类都具有自己对应的条目容器。ItemsSource里存放的是一条一条的数据,要想把数据显示出来需要为他们穿上外衣,条目容器就起到数据外衣的作用。怎么样让每件数据外衣与它对应的数据条目关联起来?当然依靠的是Binding。只要我们为一个ItemsSource属性值,ItemsControl对象就会自动迭代其中的数据元素、为每个事件元素准备一个条目容器,并使用Binding在条目容器与元素之间建立关联。

    在使用集合类型作为列表控件的ItemsSource时一般会考虑使用ObservableCollection<T>代替list<T>,因为ObservableCollection<T>类实现了InotifyCollectionChanged和InotifyCollectionChanged接口,能把集合的变化立刻通知显示它的列表控件,改变会立刻显现出来。

使用ADO.NET对象作为Binding的源

   我们使用 ADONET 类对数据库进行操作。常见的工作是从数据庫中把教据

读取到 DataTable 中,再把 DataTable 显示在 UI 列表控件里(如成續单、博客文章列表、论坛站子列表等)。尽管在流行的软件架构中并不把 DataTabl 的数据直接显示在 U 列表控件里而是先通过 LINQ 等手段把 Data Table 里的数据转换成恰当的用户自定义类型集合,但 WPF 也支持在列表控件与 Data Table 之间直接建立 Binding

注意

这里有几点需要注意的地方:

首先,从字面上理解 List View 和 GridView 应该是同一级别的拉件,实际上远非这样! ListView 是 ListBox 的派质具面 GridView 是 ViewBase 的派生类, List View 的 View 属性是一个 ViewBase 类型的对象,所以, GridView 可以作为 LitVievw 的 View 来使用而不能当作独立的拉件来使用。这里使用的理念是组合模式,即 List View “有一个” View ,至于这个 View 是 GridView 还是其他什么类型的 View 则由程序员自由选择﹣目前只有一个 GridView 可用,估计微软在这里还会有扩展。

其次, GirdView 的内容属性是 Columns ,这个属性是 GridViewColumnColection 类型对象。因为 XAML 支持对内容属性的简写,所以省略了 GridView . Columns >…</ GridView . Columns >这层标签,直接在< GridView >的内容部分定义了三个 GridViewColumn 对象, Grid ViewColumn 对象最重要的一个属性是 DisplayMemberBinding (类型为 BindingBase ).使用这个属性可以指定这一列使用什么样的 Binding 去关联数据一这与 ListBox 有点不同, ListBox 使用的是 DisplayMemberPath 属性(类型为 string )如果想用更复杂的结构来表示这一列的标题( Header )滅数据,则可为 GridViewColumn 设置 HeaderTemplate 和 CellTemplate 属性,它们的类型都是 DataTemplate

举报

相关推荐

0 条评论