WPF 中 数据绑定 ItemSource和 DataContext的不同点:

(1)DataContext 一般是一个非集合性质的对象,而ItemSource 更期望数据源是 集合对象。

(2)DataContext 是 FrameworkElement 类中定义的一个依赖属性(Dependency property),ItemsSource是 在ItemsControl 类中定义的。所有继承自FrameworkElement 的类(控件)都可以使用DataContext属性并给其赋值,但我们只能给ItemsSource赋值为集合对象

(3)DataContext不能产生模板,它只能用来筛选出数据,供其它控件来绑定。而ItemsSource主要作用就是给模板提供数据。

(4)DataContext主要用来抓取一些子元素需要使用的数据,以保证子元素能够顺利的使用数据。ItemsSource不会用来分享数据,它只是对定义好的元素有效。
以上可参照博客:
https://www.cnblogs.com/flytigger/p/4113121.html

下面来看下Itemsource,这里没有用到DataConetext,下面这个例子说明了(1)中的ItemSource 更期望数据源是 集合对象:
后台代码:

public partial class MainWindow : Window
        public MainWindow()
            InitializeComponent();
            List<string> listStrings = new List<string>();
            for (int i = 0; i < 50; i++)
                listStrings.Add(i.ToString());
            listBox.ItemsSource = listStrings;

前台代码:

<Window x:Class="WpfApplication5.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication5"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
        <ListBox Name="listBox"></ListBox> 
    </Grid>
</Window>

下面再来看看Datacontext和itemsource一起用的情况,从下面可以看出(2)中说明的情况,从调试中的代码可以看得更清楚一些,DataContext 一般是一个非集合性质的对象,然后前台的listbox绑定的是Datacontext中的MyListString的对象:
后台代码:

    public partial class MainWindow : Window
        public List<string> MyListString { get; set; }   
        public MainWindow()
            InitializeComponent();
            List<string> listStrings = new List<string>();
            for (int i = 0; i < 50; i++)
                listStrings.Add(i.ToString());
            MyListString = listStrings;
            DataContext = this;

前台代码:

<Window x:Class="WpfApplication5.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication5"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
        <ListBox Name="listBox" ItemsSource="{Binding Path=MyListString}"></ListBox> 
    </Grid>
</Window>

接着来看一个常用的绑定模式,DataContext直接绑定到类,itemsource直接绑定到类的字段:
首先来一个MainViewModel的类,并给予一个Student的字段,给字段赋值。

    public class MainViewModel
        public List<Student> listStudent { get; set; }
        public MainViewModel()
            listStudent = new List<Student> { new Student("小王", 001), new Student("小张", 002), new Student("小李", 002) };
    public class Student
        public string Name { get; set; }
        public int Id { get; set; }
        public Student(string name, int id)
            Name = name;
            Id = id;

然后直接在前台用resourc绑定这个类,listbox的itemsource绑定这个类的字段Student。
前台绑定这个类的时候,实际上就相当于把这个类实例化了,listbox的itemsource只需要静态跟踪这个类的字段。

<Window x:Class="WpfApplication5.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication5"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <local:MainViewModel x:Key="mvm"/>
    </Window.Resources>
        <ListBox Name="listBox"  ItemsSource="{Binding Source={StaticResource mvm},Path=listStudent}"  DisplayMemberPath="Name"></ListBox> 
    </Grid>
</Window>

以上也可以换到后台表示:
换掉之后,前后台代码(这里需要在后台实例化):

public partial class MainWindow : Window
        public MainWindow()
            InitializeComponent();
            MainViewModel mvm = new MainViewModel();            
            listBox.ItemsSource = mvm.listStudent;
<Window x:Class="WpfApplication5.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication5"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
        <ListBox Name="listBox"   DisplayMemberPath="Name"></ListBox> 
    </Grid>
</Window>

也可以稍微换一下绑定方式,不用Window.Resources,而改用Window.DataContext也可以:

<Window x:Class="WpfApplication5.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication5"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <local:MainViewModel/>
    </Window.DataContext>
        <ListBox Name="listBox" ItemsSource="{Binding Path=listStudent}"  DisplayMemberPath="Name"></ListBox> 
    </Grid>
</Window>

其实,我更喜欢最后一个绑定方式,然而我并不知道这个绑定方式和Window.Resources绑定方式究竟有什么内在的区别。

WPF 中 数据绑定 ItemSource和 DataContext的不同点:(1)DataContext 一般是一个非集合性质的对象,而ItemSource 更期望数据源是 集合对象。(2)DataContext 是 FrameworkElement 类中定义的一个依赖属性(Dependency property),ItemsSource是 在ItemsControl 类中定义的。所有继承自Fra
在winform开发中,我们常用到ado.net进行数据,在编程技术日新月异的今天,这种繁杂的数据方式已不能再适合开发人员,于是微软推出了wpf,更炫的界面美化,更简洁地编写控件,在wpf中使用了新的数据方式,相比于以前的方式,简洁了不少。尤其适合大规模数据的更新的任务。 实现步骤如下图: 必须在类中实现接口INotifyPropertyChanged; 然后在属性...
此段为原文翻译而来,原文地址 WPF数据 ItemSourceDataContext的不同点: 1.DataContext 一般是一个非集合性质的对象,而ItemSource 更期望数据源是 集合对象。 2.DataContext 是 FrameworkElement 类中义的一个依赖属性(Dependency property),ItemsSource是 在Ite...
义个 List<Student> stuList = new List<Student>(); 然后 this.combobox1.ItemsSource =stuList; 我更新了一下stuList,然后再次,这里就有异常了。 我想第二次更新了stuList后,让Combobox也更新。 有两种方法: 一种是将student类继承notifychanged接口,然后把stuList的类型从list改ObservableCollection。这样数据源更新了,C
DataContext用于单行,ItemSource用于多行。 Those two properties do not serve the same purpose. DataContext is a general (dependency) property of all descendants of FrameworkElement. Is is inherited throu
今天碰到错误 :在使用 ItemsSource 之前,项集合必须为空 想在TreeView中添加binding,source是ObservableCollection,一直报这个错。 终于找到原因,少了ItemTemplate这个层级。 XAML修改前:
<DataGrid x:Name="datagrid" ItemsSource="{Binding ElementName=Mwindow, Path=Preson}" Margin="0,0,0,20"> <DataGrid.Columns> <DataGridTextColumn Binding="{Binding...
重新ItemSource,虽然的集合对象Clear了,但是items还没有清空;然后再次就会有问题。 所以要么设置ItemSource =null ;要么 Items.Clear(); System.InvalidOperationException:“当 ItemsSource 正在使用时操作无效。改用 ItemsControl.ItemsSource 访问和修改元素。” 这是因为DataGrid中使用了Binding了一个List对象,而后在代码却又使用另一种方式去操作DataGrid,如使用 DataGrid.Items.Remove(selectRow); 去操作数据,这必然会导致ItemSource出现改变,而与Bind
WPF中的前台DataContext可以将数据模型与视图起来,实现数据的双向。以下是一个简单的示例: 1. 创建一个数据模型类,例如: ```csharp public class Person public string Name { get; set; } public int Age { get; set; } 2. 在XAML中创建一个控件,并将DataContext属性数据模型实例上,例如: ```xml <Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <TextBox Text="{Binding Name}" /> <TextBox Text="{Binding Age}" /> </Grid> </Window> 3. 在代码中创建数据模型实例,并将其赋值给控件的DataContext属性,例如: ```csharp public partial class MainWindow : Window public MainWindow() InitializeComponent(); DataContext = new Person { Name = "John", Age = 30 }; 这样,当用户修改文本框中的内容时,数据模型中的属性值也会随之改变,反之亦然。