首页 > 其他分享 >WPF数据绑定

WPF数据绑定

时间:2023-11-24 11:48:03浏览次数:30  
标签:数据源 绑定 user new WPF 数据 public 属性

依赖对象做为数据源

如果绑定的源是依赖对象的依赖属性,那么这个依赖属性发生实时变化的时候,会同步到绑定目标。

如果绑定的源是非依赖属性,那么这个属性发生变化的的时候,不会同步到绑定目标。

被绑定的数据源,需要是属性。

    <StackPanel>
        <!--目标对象:TextBlock-->
        <!--目标属性:Text-->
        <!--绑定数据源:tb_source-->
        <!--绑定路径:Text-->
        <!--SolidColorBrush  : Color-->
        <!--TextBox tb_source = new TextBox(){Text="Hello"}
        tb_source.ToString();-->
        <Grid>
            <TextBox Text="Hello" Name="tb_source" Foreground="Red"/>
        </Grid>
        <Grid>
            <TextBlock Text="{Binding ElementName=tb_source,Path=Text}"/>
        </Grid>
        <PasswordBox Password="123456" Name="pb"/>
        <TextBlock Text="{Binding ElementName=pb,Path=Password}"/>

        <!--1、如果绑定的源是依赖对象的依赖属性,那么这个依赖属性发生实时变化的时候,会同步到绑定目标-->
        <!--2、如果绑定的源是非依赖属性,那么这个属性发生变化的的时候,不会同步到绑定目标-->
        <!--3、被绑定的数据源,需要是属性-->
    </StackPanel>

TextBox的Text属性是依赖属性,变化时会同步到TextBlock的Text属性。

PasswordBox的Password是非依赖属性,变化是不会同步到TextBlock的Text属性。

普通数据类型或集合类型做为数据源

在Xmal中引入命名空间定义数据

        xmlns:sys="clr-namespace:System;assembly=mscorlib"
    <Window.Resources>
        <!--public int Value = 100;
            C#   定义一个int类型  默认就是32位的数据长度  4个字节-->
        <sys:Int32 x:Key="Value">100</sys:Int32>
        <sys:Int32 x:Key="V1">200</sys:Int32>

        <!--string[] list=new string[]{"AAAA","BBBB","CCCC"}-->
        <x:Array x:Key="list" Type="sys:String">
            <sys:String>AAAA</sys:String>
            <sys:String>BBBB</sys:String>
            <sys:String>CCCC</sys:String>
        </x:Array>
    </Window.Resources>
    <StackPanel>
        <TextBlock Text="{Binding Source={StaticResource Value},Path=.}" Name="tb"/>
        <TextBlock Text="{Binding Path=.}" DataContext="{StaticResource Value}"/>

        <!--Binding对象内部属性(Source)数据源优先级更高-->
        <TextBlock Text="{Binding Source={StaticResource V1},Path=.}" DataContext="{StaticResource Value}"/>

        <!--1、目前两种形式的数据源:
            依赖对象(页面上的对象,指定名称),通过ElementName建立数据源联系
            普通数据数据,演示是通过Source建立数据源联系,
                   同时也可以使用目标对象的DataContext属性进行数据源的关联
                           一般不使用DataContext属性进行数据源的关联-->


        <TextBlock Text="{Binding Source={StaticResource list},Path=[2]}"/>
        <ListBox ItemsSource="{Binding Source={StaticResource list}}"/>

        <TextBlock Text="{Binding ElementName=win,Path=Value}"/>
    </StackPanel>

单个对象做为数据源

声明一个类做为数据源

namespace Zhaoxi.BindingLesson.DataSource
{
    public class Person
    {
        public int Age { get; set; }
        public string Name { get; set; }
    }
}
    <Window.Resources>
        <!--Person p = new Person();-->
        <local:Person x:Key="p" Age="30" Name="Michael"/>

        <Button x:Key="button" Width="300" Tag="sfseg"/>
    </Window.Resources>
    <StackPanel>
        <TextBlock Text="{Binding Source={StaticResource p},Path=Name}"/>
        <TextBlock Text="{Binding Source={StaticResource p},Path=Age}"/>
        <TextBlock Text="{Binding Source={StaticResource button},Path=Tag}"/>
    </StackPanel>

ADO.NET数据做为数据源

获取数据

    public partial class ADODataSourceWindow : Window
    {
        public ADODataSourceWindow()
        {
            InitializeComponent();



            string connectstring = "data source=localhost;database=test;user id=root;password=123456;pooling=true;charset=utf8;";
            using MySqlConnection conn = new MySqlConnection(connectstring);
            conn.Open();

            MySqlDataAdapter adapter = new MySqlDataAdapter("select * from user_list", conn);
            DataTable dataTable = new DataTable();
            adapter.Fill(dataTable);

            this.lv.ItemsSource = dataTable.DefaultView;
        }
    }
    <Grid>
        <ListView Name="lv">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="id" Width="50" DisplayMemberBinding="{Binding _id}"/>
                    <GridViewColumn Header="user_id" Width="150" DisplayMemberBinding="{Binding user_id}"/>
                    <GridViewColumn Header="user_name" Width="300" DisplayMemberBinding="{Binding user_name}"/>
                </GridView>
            </ListView.View>
        </ListView>
    </Grid>

Linq结果做为数据源

    public partial class LinqDataSourceWindow : Window
    {
        public LinqDataSourceWindow()
        {
            InitializeComponent();

            string connectstring = "data source=localhost;database=test;user id=root;password=123456;pooling=true;charset=utf8;";
            using MySqlConnection conn = new MySqlConnection(connectstring);
            conn.Open();

            MySqlDataAdapter adapter = new MySqlDataAdapter("select * from user_list", conn);
            DataTable dataTable = new DataTable();
            adapter.Fill(dataTable);

            //new List<string>() { }

            this.lv.ItemsSource = from q in dataTable.AsEnumerable()
                                  where q.Field<string>("user_name").ToString() == "Jovan"
                                  select new
                                  {
                                      ID = int.Parse(q["_id"].ToString()),
                                      UserId = q.Field<string>("user_id").ToString(),
                                      UserName = q.Field<string>("user_name").ToString()
                                  };

            //this.lv.ItemsSource = result;
        }
    }
    <Grid>
        <ListView Name="lv">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="id" Width="50" DisplayMemberBinding="{Binding _id}"/>
                    <GridViewColumn Header="user_id" Width="150" DisplayMemberBinding="{Binding user_id}"/>
                    <GridViewColumn Header="user_name" Width="300" DisplayMemberBinding="{Binding user_name}"/>
                </GridView>
            </ListView.View>
        </ListView>
    </Grid>

ObjectDataProvider做为数据源

在MethodObject类中定义一个Calculator方法

namespace Zhaoxi.BindingLesson.DataSource
{
    public class MethodObject
    {
        public double Calculator(string value)
        {
            return double.Parse(value) * 100;
        }
    }
}
    <Window.Resources>
        
        <ObjectDataProvider x:Key="odp"
                            ObjectType="{x:Type local:MethodObject}"
                            MethodName="Calculator">
            <ObjectDataProvider.MethodParameters>
                <sys:String>2.0</sys:String>
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
        
    </Window.Resources>
    <StackPanel>
        <TextBlock Text="{Binding Source={StaticResource odp},Path=.}"/>
        <!--这个绑定有点特殊,特殊在绑定的源是ObjectDataProvider的参数-->
        <TextBox Text="{Binding Source={StaticResource odp},Path=MethodParameters[0],BindsDirectlyToSource=True}"/>
        <TextBox/>
    </StackPanel>

RelativeSource指定数据源

    <Window.Resources>
        <ControlTemplate x:Key="BtnTemp" TargetType="Button">
            <Border Background="{Binding Path=Background,RelativeSource={RelativeSource Mode=TemplatedParent}}"
                    Width="{TemplateBinding Width }"
                    Height="{TemplateBinding Height}">
                <ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center"/>
                <!--数据源要求可编辑,Text默认是双向绑定-->
                <!--<TextBox Text="{Binding ActualWidth,Mode=OneWay,RelativeSource={RelativeSource Mode=TemplatedParent}}"/>-->
            </Border>
        </ControlTemplate>
    </Window.Resources>
    <Window.DataContext>
        <local:Person Name="Aloha Sun" Age="30"/>
    </Window.DataContext>
    <Grid>
        <StackPanel>
            <StackPanel.DataContext>
                <local:Person Name="麦子熟了" Age="28"/>
            </StackPanel.DataContext>
            <!--<TextBlock Text="{Binding Path=Title, ElementName=win}" Foreground="Red" />-->
            <!--<TextBlock Text="{Binding Path=[1]}" Foreground="Red" />-->
            <TextBlock Text="{Binding Path=Name}" Foreground="Red" />
            <!--Mode=FindAncestor 查找祖先-->
            <TextBlock Text="{Binding Path=DataContext.Age,
                RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window}}" Foreground="Red" />

            <TextBlock Text="{Binding ElementName=win,Path=DataContext.Age}"/>
            <!--Mode=Self 查找自己-->
            <TextBlock Text="{Binding Path=Foreground,
                RelativeSource={RelativeSource Mode=Self}}" Foreground="#FF9000" />

            <Button Content="Button" Template="{StaticResource BtnTemp}"
                    Background="Orange" Tag="123"/>
        </StackPanel>
    </Grid>

标签:数据源,绑定,user,new,WPF,数据,public,属性
From: https://www.cnblogs.com/ZHIZRL/p/17851589.html

相关文章

  • 数据库连接不关闭 导致数据库 内存不断上升 内存溢出 OOM
     现象:数据库关闭原因:执行业务逻辑的一个函数,每次调用时,都新建连接,但函数返回时没有关闭连接;该函数被不断调用:数据库内存不断增长,OOM,被监控程序杀死。实测:在函数返回前关闭连接,可以避免数据库OOM。       翻译搜索复制......
  • Oracle 隐式数据类型转换的坑
    在执行sql时遇到了一个转换类型的错误 ORA-01722:invalidnumber...LEFTJOINAONB.BUSINESSID=A.ID...原因是在进行隐式数据类型转换时,BUSINESSID字段是VARCHAR2类型,其中有些业务数据包含了非数字字符,导致转换报错可以使用下面的sql查哪些数据的字段包含了非数......
  • 第五单元 表数据操作
    1.SSMS方式在数据库中选择“编辑前200行”选项,然后就可以手动直接输入数据到表行中了。手动输入的数据是确定的,而且只能一点点输入,遇到大量的数据的时候,操作会变得很繁重,而且它不满足大多数业务的需求,而且不利于更新。在对象资源管理器中,右键点击你要打开的表,然后选择“Ed......
  • PLC通过lora网关采集温室大棚温湿度数据
    概述:运用lora网关远程控制大棚内风机,日光灯,温湿度传感器等设备。可以实现远程获取现场环境的空气温湿度、土壤水分温度、二氧化碳浓度、光照强度可以自动控制温室湿帘风机、喷淋滴灌、加温补光等设备,并向远程计算机端推送实时数据,实现现场环境信息化,智能化远程管理。减少人工成......
  • uniapp-微信小程序绑定动态样式 :style 避坑
    在uniapp中绑定动态样式:style="object"使用此种方法,在H5页面中并不会出现任何问题而在微信小程序中,此种方式就会被编译成 style="[object,object]"从而导致样式无法生效解决方法:    使用:style="[object]"此种方式即可......
  • cocos creator新手入门教程:如何绑定参数到编辑器
    很多cocoscreator同学不知道如何绑定组件属性到编辑器上,今天我们来教大家如何绑定1:基本数据属性绑定到编辑器这个非常简单,模板是属性名字:默认的值;Is_debug:false,speed:100,2:系统组件类型与节点绑定到编辑器属性名字:{type:组件类型(cc.Sprite,cc.Label,cc.......
  • 深度学习中实现PyTorch和NumPy之间的数据转换知多少?
    在深度学习中,PyTorch和NumPy是两个常用的工具,用于处理和转换数据。PyTorch是一个基于Python的科学计算库,用于构建神经网络和深度学习模型。NumPy是一个用于科学计算的Python库,提供了一个强大的多维数组对象和用于处理这些数组的函数。在深度学习中,通常需要将数据从NumPy数组转换......
  • WPF使用多个ContextMenu菜单并绑定指定控件右键事件触发菜单,以及后台获取ContextMenu
    前端代码<Windowx:Class="EVES_ManualTest.CurveForm"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schema......
  • R语言集成模型:提升树boosting、随机森林、约束最小二乘法加权平均模型融合分析时间序
    原文链接:http://tecdat.cn/?p=24148原文出处:拓端数据部落公众号 最近我们被要求撰写关于集成模型的研究报告,包括一些图形和统计输出。特别是在经济学/计量经济学中,建模者不相信他们的模型能反映现实。比如:收益率曲线并不遵循三因素的Nelson-Siegel模型,股票与其相关因素之间的......
  • 数据库总结复习(并发控制二)
    目录前言死锁解决方法超时等待法等待图法串行化概念验证串行化判断冲突可串行化举例为了保证可串行而出现的封锁协议--两段锁协议概念与一次封锁的区别前言本文为JMU22级数据库原理考前复习而总结归纳,刨除了课本以及课堂上晦涩且长篇大论的文章,以尽量简洁易懂的语句来对知识点进......