精华内容
下载资源
问答
  • 2022-03-28 19:01:07

    Windows Presentation Foundation (WPF) 中的数据绑定为应用呈现数据并与数据交互提供了一种简单而一致的方法。 元素能够以 .NET 对象和 XML 的形式绑定到不同类型的数据源中的数据。 所有 ContentControl以及所有 ItemsControl都具有内置功能,使单个数据项或数据项集合可以灵活地进行样式设置。 可基于数据生成排序、筛选和分组视图。
    WPF 中的数据绑定与传统模型相比具有几个优点,包括本质上支持数据绑定的大量属性、灵活的数据 UI 表示形式以及业务逻辑与 UI 的完全分离。
    数据绑定是在应用 UI 与其显示的数据之间建立连接的过程。 如果绑定具有正确的设置,并且数据提供适当的通知,则在数据更改其值时,绑定到该数据的元素会自动反映更改。 数据绑定还意味着,如果元素中数据的外部表示形式发生更改,则基础数据可以自动进行更新以反映更改。 例如,如果用户编辑 TextBox 元素中的值,则基础数据值会自动更新以反映该更改。
    数据绑定的典型用法是将服务器或本地配置数据放置到窗体或其他 UI 控件中。 此概念在 WPF 中得到扩展,包括将大量属性绑定到不同类型的数据源。 在 WPF 中,元素的依赖属性可以绑定到 .NET 对象(包括 ADO.NET 对象或与 Web 服务和 Web 属性关联的对象)和 XML 数据。
    通常情况下,每个绑定具有四个组件:绑定目标对象、目标属性、绑定源、指向绑定源中要使用的值的路径。
    目标属性必须为依赖属性。大多数 UIElement 属性都是依赖属性,而大多数依赖属性(只读属性除外)默认支持数据绑定。 只有从 DependencyObject 派生的类型才能定义依赖项属性。 所有 UIElement 类型从 DependencyObject 派生。
    绑定源不限于自定义 .NET 对象。尽管未在图中显示,但请注意,绑定源对象不限于自定义 .NET 对象。 WPF 数据绑定支持 .NET 对象、XML 甚至是 XAML 元素对象形式的数据。 例如,绑定源可以是 UIElement、任何列表对象、ADO.NET 或 Web 服务对象,或包含 XML 数据的 XmlNode。
    当在 XAML 元素上声明数据绑定时,它们会通过查看其直接的 DataContext 属性来解析数据绑定。 数据上下文通常是绑定源值路径评估的绑定源对象。 可以在绑定中重写此行为,并设置特定的绑定源对象值。 如果未设置承载绑定的对象的 DataContext 属性,则将检查父元素的 DataContext 属性,依此类推,直到 XAML 对象树的根。 简而言之,除非在对象上显式设置,否则用于解析绑定的数据上下文将继承自父级。
    绑定的数据流可以从绑定目标流向绑定源或(在绑定源提供正确通知的情况下)从绑定源流向绑定目标。
    通过 OneWay 绑定,对源属性的更改会自动更新目标属性,但对目标属性的更改不会传播回源属性。 如果绑定的控件为隐式只读,则此类型的绑定适用。
    通过 TwoWay 绑定,更改源属性或目标属性时会自动更新另一方。 此类型的绑定适用于可编辑窗体或其他完全交互式 UI 方案。 大多数属性默认为 OneWay 绑定,但某些依赖属性(通常为用户可编辑控件的属性)。 用于确定依赖属性绑定在默认情况下是单向还是双向的编程方法是:使用 DependencyProperty.GetMetadata 获取属性元数据,然后检 查 FrameworkPropertyMetadata.BindsTwoWayByDefault 属性的布尔值。
    OneWayToSource 绑定与 OneWay 绑定相反;当目标属性更改时,它会更新源属性。
    如果数据上下文发生更改,或者数据上下文中的对象发生更改,则更改不会在目标属性中反映。 如果适合使用当前状态的快照或数据实际为静态数据,则此类型的绑定适合。 如果你想使用源属性中的某个值来初始化目标属性,且提前不知道数据上下文,则此类型的绑定也有用。 此模式实质上是 OneWay 绑定的一种简化形式,它在源值不更改的情况下提供更好的性能。

    更多相关内容
  • WPF数据绑定功能非常强大,在控件中使用数据绑定功能会为你节省大量的处理时间。本示例中,将一个变量绑定到一个控件上,在代码中改变变量值,并立刻引起控件值的变化。此代码经过删减,仅仅保留精简内容,一看就...
  • WPF 数据绑定

    2021-10-25 21:15:06
    元素绑定 <StackPanel> <TextBox x:Name="Tb1" Text="hhh"></TextBox> <Label Content="{Binding ElementName=Tb1,Path=Text}" ></Label> </StackPanel> 通过DataContext ...

    元素绑定

    <StackPanel>
        <TextBox x:Name="Tb1" Text="hhh"></TextBox>
        <Label Content="{Binding ElementName=Tb1,Path=Text}" ></Label>
    </StackPanel>
    
    

    通过DataContext 绑定

    <TextBox x:Name="Tb1" Text="{Binding Name}"></TextBox>
    
    var a = new MainWindowViewModel() { Name = "HHHH" };
    DataContext = a;
    

    INotifyPropertyChanged通知客服端值已经发生了变化

    var a = new MainWindowViewModel() { Name = "HHHH" };
    DataContext = a;
    Task.Run(async ()=> {
        await Task.Delay(3000);
        a.Name = "变更通知";
    });
    
    
    public class MainWindowViewModel:INotifyPropertyChanged
    {
        private string _name;
    
        public string Name
        {
            get { return _name; }
            set
            {
                _name = value;
                OnPropertyChanged("Name");
            }
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        protected void OnPropertyChanged(string propName)
        {
            if (PropertyChanged != null)
                PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propName));
        }
    }
    
    

    使用第三方插件进行通知

    安装 MvvmLight

    public class MainWindowViewModel: ViewModelBase
    {
        private string _name;
    
        public string Name
        {
            get { return _name; }
            set
            {
                _name = value;
                RaisePropertyChanged();
            }
        }
    }
    
    

    使用Command 点击事件

    public class MainWindowViewModel: ViewModelBase
    {
        private string _name;
    
        public MainWindowViewModel()
        {
            SaveCommand = new RelayCommand(() => {
                Name = "点击事件的变更通知";
            });
        }
    
        public string Name
        {
            get { return _name; }
            set
            {
                _name = value;
                RaisePropertyChanged();
            }
        }
    
        public RelayCommand SaveCommand { get; private set; }
    }
    
    
    <Button Content="点击" Command="{Binding SaveCommand}"></Button>
    
    展开全文
  • WPF数据绑定案例

    2022-03-14 17:02:22
    WPF数据绑定案例,效果和代码如下: <Window x:Class="DataBindingDemo.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x=...

    WPF数据绑定案例,效果和代码如下:
    在这里插入图片描述

    <Window x:Class="DataBindingDemo.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:DataBindingDemo"
            mc:Ignorable="d"
            Title="List of Products" SizeToContent="WidthAndHeight">
        <Window.Resources>
                <DataTemplate x:Key="GroupingHeaderTemplate">
                    <TextBlock Text="{Binding Path=Name}" Style="{StaticResource GroupHeaderStyle}"/>
                </DataTemplate>
    
                <CollectionViewSource
                    Source="{Binding Source={x:Static Application.Current}, Path=AuctionItems}"
                    x:Key="ListingDataView" />
        </Window.Resources>
    
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="300" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
    
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
    
            <TextBlock Grid.Row="0" Grid.ColumnSpan="3"
                       Style="{StaticResource TitleStyle}" Margin="8,20,8,8"
                       AutomationProperties.HeadingLevel = "Level1" 
                       AutomationProperties.Name="{Binding RelativeSource={RelativeSource Self}, Path=Text}">
                List of items for sale:
            </TextBlock>
            <CheckBox Name="Grouping" Grid.Row="1" Grid.Column="0"
                      Checked="AddGrouping" Unchecked="RemoveGrouping"
                      Margin="8" Style="{StaticResource CheckBoxStyle}">
                Group by category
            </CheckBox>
            <CheckBox Name="Filtering" Grid.Row="1" Grid.Column="1"
                      Checked="AddFiltering" Unchecked="RemoveFiltering"
                      Margin="8" Style="{StaticResource CheckBoxStyle}">
                Show only bargains
            </CheckBox>
            <CheckBox Name="Sorting" Grid.Row="1" Grid.Column="2"
                      Checked="AddSorting" Unchecked="RemoveSorting"
                      Margin="8" Style="{StaticResource CheckBoxStyle}">
                Sort by category and date
            </CheckBox>
    
    
            <ListBox Name="Master" AutomationProperties.Name="Items For Sale" Grid.Row="2" Grid.ColumnSpan="3" Margin="8"
                     ItemsSource="{Binding Source={StaticResource ListingDataView}}"
                     ItemContainerStyle="{StaticResource AuctionItemContainerStyle}"
                     AutomationProperties.LiveSetting="Assertive">
                <ListBox.GroupStyle>
                    <GroupStyle
                        HeaderTemplate="{StaticResource GroupingHeaderTemplate}" />
                </ListBox.GroupStyle>
            </ListBox>
    
    
            <ContentControl Name="Detail" Grid.Row="3" Grid.ColumnSpan="3"
                            Content="{Binding Source={StaticResource ListingDataView}}"
                            ContentTemplate="{StaticResource DetailsProductListingTemplate}"
                            Margin="9,0,0,0" IsTabStop="False"/>
            <Button Name="OpenAddProduct" Grid.Row="4" Grid.Column="1" Content="Add Product" HorizontalAlignment="Center"
                    Margin="8"
                    Click="OpenAddProductWindow" />
            
        </Grid>
    </Window>
    
    展开全文
  • WPF 数据绑定 命令绑定 事件绑定 View和ViewModel的通信
  • wpf前端的数据绑定主要分为元素、资源以及后台数据三种,元素可以简单的理解为前端的空间数据绑定,资源是在resource里找数据,而后台就是跟cs文件之间的数据互相传递。

            wpf前端的数据绑定主要分为元素、资源以及后台数据三种,元素可以简单的理解为前端的空间数据绑定,资源是在resource里找数据,而后台就是跟cs文件之间的数据互相传递。

     

            先说下元素吧,也就是控件元素,因为代码比较简单,就不上效果了,自己可以把下面两行代码复制到xaml文件里运行看,主要就是一个滑动块与文本框互相影响的效果,如果用winfrom来实现,要为两个控件分别写个方法。

            <Slider Name="sd"  Width="200"   />
            <TextBox Text="{Binding ElementName=sd,Path=Value}"  Height="40"   Width="200"/>

            接着说资源数据绑定,用到了resource,可以自己设置数据源到xml文件里,然后前端用key名称来获取值
           

    <Window.Resources >
            <TextBlock x:Key="txt">hello world</TextBlock>
    
    </Window.Resources>
    
      <!--资源绑定-->
            <TextBox Text="{Binding  Source={StaticResource  txt}, Path=Text}" TextWrapping="Wrap/>

            最后,来讲下重点后台数据绑定,也是wpf精华的地方,后台数据绑定可以把数据绑定到窗口,也可以绑定到控件。

    1、先展示一下绑定到控件的写法,先在xaml里写入

    <TextBlock x:Name="txt2" Text="{Binding Name,FallbackValue=没找到 }" HorizontalAlignment="Left" Margin="52,140,0,0" TextWrapping="Wrap"  Width="100" VerticalAlignment="Top" />

    然后在cs文件里写入,这样程序运行后,自动就会在文本框里显示李四的字样了。
       

        //student st = new student() { Name = "张三1" };
        //txt2.DataContext = st;  
    
        txt2.DataContext = new student() 
    
    
      class student 
        {
            public string Name { get  ; set  ; } ="李四";
        }

    2、接着展示一下绑定到窗口的写法,先增加一个类,叫MainViewModel.cs,内容如下:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace WpfApp7
    {
        class MainViewModel : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
            public void NotifyPropertyChanged(string propertyName)
            {
                if (this.PropertyChanged != null)
                {
                    this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
            private int age;
            public int Age
            {
                get {return  age; }
                set
                {
                    age = value;
                    NotifyPropertyChanged("Age");
                }
            }
            public int Height { get => height; set => height = value; }
            int height;
            public MainViewModel()
            {
                Age = 18;
                Height = 171;
            }
    
        }
    }
    

    在mianwindow窗口里,通过实例化的方法把值获取到,代码如下:

      this.DataContext =new  MainViewModel();
    
    
    
     private void Button_Click(object sender, RoutedEventArgs e)
            {
                MainViewModel mvd = (MainViewModel)this. DataContext;
                mvd.Age++;//Age会增加,因为有  NotifyPropertyChanged("Age");
                mvd.Height++;//Height不会增加
            }

    最后在xaml里展示出来

            <TextBox   Text="{Binding Age}" VerticalAlignment="Top" Width="120"/>

    3、绑定到后台数据,先上xaml部分

    <DataGrid ItemsSource="{Binding StuCln}" HorizontalAlignment="Left" Height="143" Margin="365,28,0,0" VerticalAlignment="Top" Width="400">
                <DataGrid.Columns  >
                    <DataGridTextColumn Header="序号" Binding="{Binding Id}"></DataGridTextColumn>
                    <DataGridTextColumn Header="姓名" Binding="{Binding Name}"></DataGridTextColumn>
                    <DataGridTextColumn Header="年龄" Binding="{Binding Age}"></DataGridTextColumn>
                </DataGrid.Columns>

    接着是代码部分,这里有个mvvm的思想,就是model类和viewmodel类要区分开,本demo是合在一起写的,可以自行分解开看

    using Newtonsoft.Json;
    using System;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using System.ComponentModel;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    
    namespace WpfApp9
    {
        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            Student stu;
            
    
            public MainWindow()
            {
                InitializeComponent();
                stu = new Student() { Id = 1, Name = "张三", Age = 18 }; //初始化数据
                stu.StuCln = new ObservableCollection<Student>();
    
                stu.StuCln.Add(stu);
                this.DataContext = stu;
            }
    
           
            
    
    
     
    
    
    
        }
    
    
    
    
       public  class Student : INotifyPropertyChanged
        {
            //旧的写法,标准但是繁琐
            private int id;
            public int Id
            {
                get { return id; }
                set
                {
                    id = value;
                    NotifyPropertyChanged("Id");
                }
            }
            // 简化后错误写法,无法生效
            private string name;
            public string Name
            {
                get => name; 
                set => setValue(ref name, value,Name);//这种写法值不会变
            }
    
            //简化后正确写法
            private int age;
            public int Age 
            {     
                get => age;
                set => setValue(ref age, value,nameof(Age));
            }
            private void setValue<T>(  ref T propertyName, T  value,string   fatherPropertyName)
            {
                propertyName = value;
                NotifyPropertyChanged(fatherPropertyName);
            }
    
            ObservableCollection<Student> stuCln;
            public ObservableCollection<Student> StuCln
            { 
                get => stuCln;
                set => setValue(ref stuCln, value, nameof(StuCln));
            }
    
    
            public event PropertyChangedEventHandler PropertyChanged;
            public void NotifyPropertyChanged(string propertyName)
            {
                if (this.PropertyChanged != null)
                {
                    this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
    
          
          
        }
    }
    

    展开全文
  • wpf数据绑定

    2021-07-12 21:59:08
    数据绑定 wpf的后台绑定有代码提示工具更容易理解,前端绑定不好调试,绑定了错误的数据不好查看错误,唯一的错误提示,只能在运行过程的控制台输出查看 前端绑定 datacontext,数据源可以通过datacontext设置...
  • WPF使用TextBox绑定List多层绑定,说明在我的博客https://blog.csdn.net/chulijun3107/article/details/102010865。那块也有全部的代码。
  • 记一次WPF数据绑定无效的坑,谨慎使用Internal,Internal会导致数据无法绑定
  • WPF 数据绑定
  • 逐步的示例集,带您逐步了解如何使用数据绑定和ComboBoxes。
  • C# WPF 数据绑定

    2019-09-26 04:54:21
    后台通知: public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) { ...
  • WPF数据绑定例子

    热门讨论 2012-08-09 12:42:26
    一个WPF数据绑定的例子,适用于初学者,更好的理解WPF与WinForm开发的不同之处。
  • wpf 数据绑定 例子

    2013-07-11 21:28:26
    wpf 数据绑定 例子 ,当年就看的这个例子入门的。
  • 数据源Source-目标Target 数据源实现INotifyPropertyChanged接口,实现“通知” 目标实现依赖属性 举例 后台的数据源,实现INotifyPropertyChanged接口,实现“通知” public class Student : ...
  • 逐步介绍WPF数据绑定的世界。
  • 实现了数据的双向绑定,更改DataGrid的数据会更新后台数据,更改后台数据会在DataGrid上实时显示。
  • WPF数据绑定之UpdateSourceTrigger 在XMAL中进行数据帮的时候,可以进行对Binding的UpdateSourceTrigger属性赋值来确定什么时候来更新数据,它的类型是UpdateSourceTrigger的枚举,可取值位PropertyChanged(属性改变...
  • WPF 数据绑定模式

    2017-08-31 12:23:03
    oneWay:使用 OneWay 绑定时,每当源发生变化,数据就会从源流向目标。 OneTime: 绑定也会将数据...3.每一个WPF中的控件都有一个DataContext属性,集合控件会有一个ItemSource的属性,这些属性都可以让我们去绑定数据
  • Wpf数据绑定倒计时.zip

    2019-07-05 21:29:29
    该资源使用MVM模式以及WPF中的数据绑定开发的一个小案例,通过绑定改文字,图片,颜色等外加计时

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,451
精华内容 8,580
关键字:

wpf的数据绑定