精华内容
下载资源
问答
  • WPF的数据绑定

    2021-01-24 14:49:29
    WPF的数据绑定,必须要有绑定目标和要绑定的数据源。绑定目标可以是继承自 DependencyProperty的任何可访问的属性或控件,例如 TextBox 控件的 Text 属性。数据源可以是其他控件的属性,可以是对象实例、XAML ...

     WPF 中的数据绑定,必须要有绑定目标和要绑定的数据源。绑定目标可以是继承自 DependencyProperty的任何可访问的属性或控件,例如 TextBox 控件的 Text 属性。数据源可以是其他控件的属性,可以是对象实例、XAML 元素、ADO.NET Dataset、XML数据。微软针对XML绑定与对象绑定,提供了两个辅助类XmlDataProvider 和 ObjectDataProvider。Binding是用来实现界面控件的属性与后台数据之间的绑定,通过这种形式将前台界面与后台数据联系在一起达到界面与数据耦合的目的。

    WPF有四种绑定方法,分别是OneWay,OneWayToSource,TwoWay,OneTime。下面分别介绍一下各自的用法:

    1:OneWay,单向影响,当绑定源(源)更改时,更新绑定目标(目标)属性。如果要绑定的控件为隐式只读控件,则适用此绑定类型。例如,可以绑定到如股市代号之类的源。或者,可能目标属性没有用于进行更改(例如表的数据绑定背景色)的控件接口。如果不需要监视目标属性的更改,则使用 OneWay 绑定模式可避免 TwoWay 绑定模式的系统开销。即A可以影响B,而B影响不了A,例子如下:

    2:OneWayToSource,单向影响,与OneWay刚好相反。 当目标属性更改时更新源属性,即B可以影响A,而A影响不了B,例子如下:

    3:TwoWay  双向影响, 导致对源属性或目标属性的更改可自动更新对方,即A可以影响B,B也能影响A。此绑定类型适用于可编辑窗体或其他完全交互式 UI 方案,例子如下:

    4:OneTime  在OneWay的基础上延伸了一个OneTime,无论哪种绑定,只能绑定一次。当应用程序启动或数据上下文更改时,更新绑定目标。 此绑定类型适用于以下情况:使用当前状态的快照适合使用的或数据状态实际为静态的数据。 如果要从源属性初始化具有某个值的目标属性,并且事先不知道数据上下文,则也可以使用此绑定类型。 此绑定类型实质上是 OneWay 绑定的简化形式,在源值不更改的情况下可以提供更好的性能。

    例子如下: 

     

    展开全文
  • Wpf的数据绑定

    2010-12-08 11:29:00
    假设ViewModel中包含一个Report类型属性,而Report类中有一个属性ProgressValue,我们需要将进度条Value值绑定到这个属性 1、在Xaml中这样书写:Value="{Binding Report.ProgressValue}" 2、Report必须继承自:...

     

    假设ViewModel中包含一个Report类型的属性,而Report类中有一个属性ProgressValue,我们需要将进度条的Value值绑定到这个属性

    1、在Xaml中这样书写:Value="{Binding Report.ProgressValue}"

    2、Report必须继承自:INotifyPropertyChanged,且包含如下的代码:

          private void OnPropertyChanged(string Name)

          {
               if (PropertyChanged != null)
               PropertyChanged(this, new PropertyChangedEventArgs(Name));

          }

        public event PropertyChangedEventHandler PropertyChanged;

    3、当然在Report的ProgressValue中,应该引发属性改变事件:

    double _ProgressValue;
    public double ProgressValue
    {
        get { return _ProgressValue; }
        set
        {

            _ProgressValue = value;
            OnPropertyChanged("ProgressValue");
        }
    }

    经过测试,这种方法可以顺利的运行。

    转载于:https://www.cnblogs.com/by1990/archive/2010/12/08/1900017.html

    展开全文
  • WPF的数据绑定之数据绑定基础(绑定到元素属性) 前路漫漫其修远兮 数据绑定可以将任何控件的任何属性绑定到其他控件的属性、对象、数据库等,在WPF中,数据绑定主要在如下所示的两个对象之间建立关系。 数据源...

    WPF的数据绑定之数据绑定基础(绑定到元素属性)

    前路漫漫其修远兮

    数据绑定可以将任何控件的任何属性绑定到其他控件的属性、对象、数据库等,在WPF中,数据绑定主要在如下所示的两个对象之间建立关系。

    • 数据源对象:WPF将从改对象中提取信息,交由目标对象进行显示。
    • 目标对象:从数据源中提取信息,并赋给该对象的属性。

    C#WPF 在Binding 中Path的意思

    <TextBox x:Name="txt1" />
    <TextBlock x:Name="txt2" Text="{Binding Path=Text, ElementName=txt1}" />
    

    //绑定的是名为txt1的 TextBox(控件类型)控件,但是TextBlock要显示的当然不是控件类型了,所以需要一个标示再次指定显示什么,Path就有用了,在这里表示TextBox类型控件的Text值,就是说,txt1中显示的值。
    “{Binding Path=Text, ElementName=txt1}” 标示 txt1中的Text的值。

    <TextBlock x:Name="txt2" Text="{Binding Path=Text, ElementName=txt1}" />
    

    如果 txt1.Text 是“这是txt1”,txt2由于它的Text绑定了txt1.Text属性,所以txt2.Text 显示的也是“这是txt1”,而且如果txt1.Text的值变动,txt2.Text的值也变动。


    绑定多个属性
    XAML:其中还涉及绑定方向,绑定更新的内容,后面一一介绍

    <Grid  Margin="5">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"></RowDefinition>
                <RowDefinition Height="Auto"></RowDefinition>
                <RowDefinition Height="Auto"></RowDefinition>
                <RowDefinition Height="Auto"></RowDefinition>
                <RowDefinition Height="Auto"></RowDefinition>
            </Grid.RowDefinitions>
            <!-- 数据源对象-->
            <Slider Name="sliderFontSize" Margin="3" Minimum="1" Maximum="40" Value="10"></Slider>
            <TextBox Name="txtContent" Margin="3" Grid.Row="1" Text="示例内容"></TextBox>
            <ListBox Margin="3" Grid.Row="2" Name="lstColors">
                <ListBoxItem Tag="Blue">蓝色</ListBoxItem>
                <ListBoxItem Tag="DarkBlue">深蓝</ListBoxItem>
                <ListBoxItem Tag="LightBlue">淡蓝</ListBoxItem>
            </ListBox>
            <!--实现多个数据源绑定,目标对象-->
            <TextBlock Margin="3" Name="lblSampleText"
                       FontSize="{Binding ElementName=sliderFontSize,Path=Value}" Grid.Row="3"
                       Text="{Binding ElementName=txtContent,Path=Text, Mode=OneWay}"
                       Foreground="{Binding ElementName=lstColors,Path=SelectedItem.Tag}"
                       >
                
            </TextBlock>
            <TextBox
                Margin="3" Name="lblSampleText2"
                 FontSize="{Binding ElementName=sliderFontSize,Path=Value}" Grid.Row="4"
                       Text="{Binding ElementName=txtContent,Path=Text, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged
                }"
                       Foreground="{Binding ElementName=lstColors,Path=SelectedItem.Tag}"
                >
    
            </TextBox>
        </Grid>
    
    •  

    绑定的方向,使用Mode属性指定。

    • OneWay:当源属性发生更改时更新目标属性
    • TwoWay:当源属性发生更改时更新目标属性,当目标属性发生更改时,同时也更新源属性
    • OneTime:仅当程序启动时或DataContext进行更改时更新目标属性
    • OneWayToScource:目标属性更改时更新源属性
    • Default:使用目标属性默认Mode值

    绑定更新
    在TwoWay模式,当目标对象发生更改时,变化不会立即被传递到数据源。这时需要定义Binding.UpdateSourceTrigger属性。

    • Default:绑定目标属性默认UpdateSourceTrigger值。多数依赖项属性的默认值为PeopertyChanged,而Text属性的默认值为LostFocus。
    • PeopertyChanged:当绑定目标属性更改时,立即更新绑定源。
    • LostFocus:当绑定目标元素失去焦点时,更新绑定源。
    • Explicit:仅在调用UpdateSource()方法时更新绑定源。
      就像上述例子一样,用到的是PeopertyChanged。
      UpdateSourceTrigger.Explicit则在用户显示地调用代码才能更新,这在一些场合是非常有用的,比如,如果希望用户一次性输入所有设定后,单击一个确定按钮,才将用户所作的改变提交并更新这种情形下。一般是调用BindingExpression.UpdateSource方法触发立即更新。
      BindingExpression封装了与绑定有关的信息。
      例子:
      XAML
     <Grid  Margin="5">
       <!-- 绑定来源-->
            <ScrollBar Name="scroll" Orientation="Horizontal" Margin="24" Maximum="100" LargeChange="10" SmallChange="1"/>
            <!-- 绑定目标-->
            <TextBox HorizontalAlignment="Center" Name="scrollfontsize" Width="200"  Height="50" Text="{Binding ElementName=scroll, Path=Value,Mode=TwoWay, UpdateSourceTrigger=Explicit}" FontSize="30" Margin="10,0,297,0" VerticalAlignment="Top"/>
            <!--应用更新按钮-->
            <Button Name="btn" Content="应用更新" Width="50" Click="btn_Click" Height="30" Margin="352,33,105,247"/>
        </Grid>
    

    后台

    private void btn_Click(object sender, RoutedEventArgs e){
         //获取应用到TextBox的BindingExpression对象
         BindingExpression binding = scrollfontsize.GetBindingExpression(TextBox.TextProperty);
         //更新ScrollBar的value属性
         binding.UpdateSource();
    }
    

    引申:[WPF]静态资源(StaticResource)和动态资源(DynamicResource)

     

    绑定自定义的数据类对象

    转载自https://blog.csdn.net/i1tws/article/details/67655880

    在xaml代码中,Binding标记扩展中仅定义了Path属性,将它绑定到StudentData类的属性上。不需要定义源对象,因为通过指定DataContext类定义源对象。

    DataContext是一个依赖属性,它用基于FramewrokElement定义。指定相应控件的DataContext属性表示当前控件中的每个元素都默认绑定此数据。

    <Window x:Class="BindingDemo.Window2"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="Window2" Height="300" Width="300">
        <Grid>
            <!-- 简单对象的绑定 -->
            <StackPanel Name="stackPanel" HorizontalAlignment="Left" VerticalAlignment="Top" Orientation="Vertical">
                <Label Name="lbId" Content="{Binding ID}"/>
                <Label Name="lbName" Content="{Binding Name}"/>
                <Label Name="lbAge" Content="{Binding Age}"/>
            </StackPanel>
        </Grid>
    </Window>

    数据类

    namespace BindingDemo{
        public class StudentData{
            public int ID { get; set; }
            public string Name { get; set; }
            public int Age { get; set; }
        }
    }

    隐藏代码

    public partial class Window2 : Window{
            public Window2(){
                InitializeComponent();
                Init();
            }
     
            public void Init(){
                StudentData stuData = new StudentData();
                stuData.ID = 1001;
                stuData.Name = "小明";
                stuData.Age = 18;
     
                //this.DataContext = stuData;//整个窗口内的所有元素都可以绑定此数据
                stackPanel.DataContext = stuData;//仅stackPanel内的所有元素可以绑定此数据
            }
        }

    以上绑定当修改数据内容时界面显示是不会更改的,要实现更改信息传递给用户界面,数据类必须实现INotifyPropertyChanged接口。

    该接口定义了ProperytChanged事件,该事件在OnPropertyChagned方法中触发。

    xaml代码

    <Window x:Class="BindingDemo.Window2"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="Window2" Height="300" Width="300">
        <Grid>
            <!-- 简单对象的绑定 -->
            <StackPanel Name="stackPanel" HorizontalAlignment="Left" VerticalAlignment="Top" Orientation="Vertical">
                <Label Name="lbId" Content="{Binding ID}"/>
                <Label Name="lbName" Content="{Binding Name}"/>
                <Label Name="lbAge" Content="{Binding Age}"/>
                <Button Name="btnChang" Content="按钮" Click="btnChang_Click"/>
            </StackPanel>
        </Grid>
    </Window>

    数据类

    namespace BindingDemo{
        public class StudentData : INotifyPropertyChanged{
            private int _id = 0;
            private string _name = "";
            private int _age = 0;
     
            public int ID { 
                get { return _id; } 
                set { 
                    _id = value;
                    OnPropertyChanged("ID");
                } 
            }
            public string Name{
                get { return _name; }
                set  { 
                    _name = value;
                    OnPropertyChanged("Name");
                }
            }
            public int Age {
                get { return _age; }
                set { 
                    _age = value;
                    OnPropertyChanged("Age");
                }
            }
     
            public event PropertyChangedEventHandler PropertyChanged;
            protected void OnPropertyChanged(string propertyName){
                if(PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
        }
    }

    隐藏代码
        public partial class Window2 : Window
        {
            public Window2()
            {
                InitializeComponent();
     
                Init();
            }
     
            private StudentData stuData;
            public void Init()
            {
                stuData = new StudentData();
                stuData.ID = 1001;
                stuData.Name = "小明";
                stuData.Age = 18;
     
                //this.DataContext = stuData;//整个窗口内的所有元素都可以绑定此数据
                stackPanel.DataContext = stuData;//仅stackPanel内的所有元素可以绑定此数据
            }
     
            private void btnChang_Click(object sender, RoutedEventArgs e)
            {
                stuData.ID = 1002;
                stuData.Name = "小红";
                stuData.Age = 17;
            }
        }

    此时运行程序点击按钮更改信息时发现用户界面显示的数据也跟着刷新了。下面的内容是对上面的数据类做的进一步封装。最终效果是一样的。


    先创建一个实现INotifyPropertyChanged接口的一个抽象类基类BindableObject,数据类只需要继承此抽象基类自然就实现了接口INotifyPropertyChanged

    namespace BindingDemo
    {
        public abstract class BindableObject : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
            protected void OnPropertyChanged(string propertyName)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
     
            protected void SetProperty<T>(ref T item,T value,[CallerMemberName] string propertyName=null)
            {
                if(!EqualityComparer<T>.Default.Equals(item,value))
                {
                    item = value;
                    OnPropertyChanged(propertyName);
                }
            }
        }
    }


    namespace BindingDemo
    {
        public class StudentData : BindableObject
        {
            private int _id = 0;
            private string _name = "";
            private int _age = 0;
     
            public int ID 
            { 
                get { return _id; } 
                set 
                { 
                    SetProperty(ref _id,value);
                } 
            }
            public string Name
            {
                get { return _name; }
                set 
                {
                    SetProperty(ref _name, value);
                }
            }
            public int Age 
            {
                get { return _age; }
                set 
                {
                    SetProperty(ref _age, value);
                }
            }
        }
    }


    [CallerMemberName]获取调用方的属性或方法名称

    EqualityComparer<T>    T为要比较的对象的类型

    EqualityComparer<T>.Default  返回一个默认的相等比较器,用于比较此泛型自变量指定的类型。

     

    展开全文
  • 一、WPF数据绑定的概要 数据绑定:是应用程序 UI 与业务逻辑之间建立连接过程。 如果绑定正确设置并且数据提供正确通知,则当数据值发生更改时,绑定到数据视觉元素会自动反映更改。 数据绑定可能还意味着...
  • 昨天本人写了一篇文章《WPF的数据绑定——MVVM模式下控件与类成员及类对象成员双向绑定》,地址为:http://blog.csdn.net/mandylover/article/details/69944513,经进一步调试,发现了一个bug,即改变类对象成员的值...

    昨天本人写了一篇文章《WPF的数据绑定——MVVM模式下控件与类成员及类对象成员双向绑定》,地址为:http://blog.csdn.net/mandylover/article/details/69944513,经进一步调试,发现了一个bug,即改变类对象成员的值后无法更新控件的值。

    验证代码是:

        public partial class Page1 : Page
        {
            private TestViewMode vm = null;
            public Page1()
            {
                InitializeComponent();
                vm = TestViewMode.CreateInstance();
                this.DataContext = vm;
            }
    
            private void button1_Click(object sender, RoutedEventArgs e)
            {
                vm.tc.strName = "重新命名,但是没想好名字";
            }
        }
    经分析,如果赋值给类对象(vm.tc),会触发通知,但赋值给类对象的成员变量(vm.tc.strName),则不会。

    那我们必须对ViewMode进行调整,需在调用类的成员也设置绑定属性改变通知,才能实现类对象成员双向绑定的功能,修正的代码如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ComponentModel;
    
    namespace TestBinding
    {
        public abstract class BindableBase : INotifyPropertyChanged
        {
    
            public event PropertyChangedEventHandler PropertyChanged;
    
            protected bool SetProperty<T>(ref T storage, T value, String propertyName = null)
            {
                if (Equals(storage, value))
                {
                    return false;
                }
    
                storage = value;
                this.OnPropertyChanged(propertyName);
                return true;
            }
    
            protected void OnPropertyChanged(string propertyName = null)
            {
                PropertyChangedEventHandler eventHandler = this.PropertyChanged;
                if (eventHandler != null)
                {
                    eventHandler(this, new PropertyChangedEventArgs(propertyName));
                }
            }
        }
        class TestViewMode : BindableBase
        {          
            //public event PropertyChangedEventHandler PropertyChanged;
            //protected void OnPropertyChanged(string propertyName)
            //{
            //    PropertyChangedEventHandler handler = PropertyChanged;
            //    if (handler != null)
            //    {
            //        handler(this, new PropertyChangedEventArgs(propertyName));
            //    }
            //}
    
            //建立静态对象,以便复用
            public static TestViewMode vm = null;
            private TestViewMode()
            {
                strTempText = "这是ViewMode的一个成员变量";
                tc = new TempClass();
                tc.strName = "来自其他类的成员变量";
            }
            /// <summary>
            /// 创建ViewModel实例,先判断一下是否已存在,如已存在,则使用之前实例对象
            /// </summary>
            /// <returns>返回实例对象</returns>
            public static TestViewMode CreateInstance()
            {
                if (vm == null)
                {
                    vm = new TestViewMode();
                }
                return vm;
            }
            /// <summary>
            /// 类内成员
            /// </summary>
            private string _strTempText = "";
            public string strTempText
            {
                get { return _strTempText; }
                set
                {
                    _strTempText = value;
                    OnPropertyChanged("strTempText");
                }
            }
            /// <summary>
            /// 类对象
            /// </summary>
            private TempClass _tc = null;
            public TempClass tc
            {
                get
                {
                    return _tc;
                }
                set
                {
                    _tc = value;
                    OnPropertyChanged("tc");
                }
            } 
        }
        public class TempClass:BindableBase
        {
            //public string strName { get; set; }                
            private string _strName = "";
            public string strName
            {
                get
                {
                    return _strName;
                }
                set
                {
                    SetProperty(ref _strName, value, "strName");
                }
            }
        }
    }
    
    重新运行,可实现双向绑定,如下:

    更新后的代码:http://download.csdn.net/detail/mandylover/9810572



    展开全文
  • WPF的数据绑定支持数据绑定的各种属性、灵活的数据 UI 表示形式,以及业务逻辑与 UI 的完全分离。 数据绑定是在应用程序 UI 与业务逻辑之间建立连接的过程。 每个绑定都具有四个组件:绑定目标对象、目标属性、...
  • 最近研究WPF,遇到并解决了一些难题(至少是初学者入门难题),包括: 1)控件如何绑定数据? 2)控件与数据如何双向绑定? 3)控件如何绑定类成员变量? 4)控件如何绑定类对象成员变量? 5)每次加载页面...
  • WPF的数据绑定(三)

    2018-08-03 16:15:52
     这次我们来学习新绑定知识,XML数据绑定。XmlDataProvider 用来绑定 XML 数据,该XML数据可以是嵌入.Xmal文件 XmlDataProvider 标记中,也可以是外部位置引用文件中。  当然嵌入式 XML 内容必须置于 Xm...
  • Wpf的数据绑定(一)

    2016-01-13 09:32:49
    最近在看公司源码,因为项目中用了很多数据绑定(比起其他奇怪框架,我只看得懂那是数据绑定~_~ 所以我就从数据绑定学起)  这一次先讲以下2个,就拿textbox做示范  1.textbox绑定一次性后台固定数据   2...
  •  例如下边代码,textBox1绑定textBlock2Text属性时候,数据上下文就是Grid或者Grid父容器DataContext,上下文中能用到就是界面元素属性。 二、可以在任何时候显式设置上下文,但是设置上下文以后绑定才...
  • 我这里定义了Combobox和Textbox,并分别命名为combobox1和textbox1,然后我就把TextBoxcontent属性绑定到ComboboxselectedItemContent,但是我调试时候无论Combobox选择了什么项,TextboxText都没有任何...
  • 使用 WPF 数据绑定模型可以将 ValidationRules 与 Binding 对象相关联。ValidationRule 对象可检查属性值是否有效。WPF 具有以下两种类型内置 ValidationRule 对象: ExceptionValidationRule 检查在更新绑定源...
  • 参考https://www.cnblogs.com/KeithWang/archive/2012/03/29/2423005.html ... 第一章、TemplateBinding定义 TemplateBinding是为了某个特定场景优化出来的数据绑定版本--需要把ControlTem...
  • WPF的数据绑定笔记摘录

    千次阅读 2012-03-31 00:17:10
    所谓数据绑定,其概念很简单,数据绑定决定了一个Source改变会不会,以及怎样自动通知并改变Destination。 Source可以是数据表,可以是XML,可以是一个内存数据,也可以是一个控件某个属性值。 Destination...
  • 绑定基本类型时因为基本类型要通过 = 来赋值,可以在set里触发PropertyChanged通知数据更改,但是类里面有其他自定义类型和list和dictionary这些话要怎样绑定 list不改成ObservableCollection前提下。。。
  • 使用 Binding 对象建立绑定,每个绑定通常都具有四个组件:绑定目标、目标属性、绑定源、要使用源值路径。既可用标记扩展(XAML)来声明绑定,也可用代码来实现绑定绑定指定主要有以下4种方式:1....
  • 如果要将值转换器与绑定关联,请创建一个实现 IValueConverter 接口类,然后实现 Convert 和 ConvertBack 方法。转换器可以将数据从一种类型更改为另一种类型,根据区域性信息转换数据,或修改表示形式其他方面...
  • 最近研究WPF,遇到并解决了一些难题(至少是初学者入门难题),包括: 1)控件如何绑定数据? 2)控件与数据如何双向绑定? 3)控件如何绑定类成员变量? 4)控件如何绑定类对象成员变量? 5)每次加载页面时,...
  • ItemsControl对象(如 ListBox、ListView 或 TreeView)来显示数据集合,数据源使用 ObservableCollection<T> 或一个现有集合类,如 List<T>、Collection<T> 和 BindingList<T> 等。通过...
  • 许多WPF或者Winform程序在保存数据时,会以EXCEL或者文本的形式展现可视化界面的数据,本文就简单介绍下将DataGrid列表信息保存为EXCEL到指定的路径下,例子很简单,用的着的直接用吧。 没有太多的理论性东东,下面...
  • 一、在后台创建控件,用代码进行数据绑定,无法实现问题。 xaml中创建button1,建立按钮事件;后台窗口构造函数中创建button2和textblock,button2建立按钮事件。 在button1事件中把textblockleft坐标绑定到...
  • WPF UI数据绑定

    2010-08-17 16:46:10
    程序演示了如何使用WPF的数据绑定,同步UI显示。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,390
精华内容 1,356
关键字:

wpf的数据绑定